{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 机器学习工程师纳米学位\n",
    "## 深度学习\n",
    "## 项目：搭建一个数字识别项目\n",
    "\n",
    "在此文件中，我们提供给你了一个模板，以便于你根据项目的要求一步步实现要求的功能，进而完成整个项目。如果你认为需要导入另外的一些代码，请确保你正确导入了他们，并且包含在你的提交文件中。以**'练习'**开始的标题表示接下来你将开始实现你的项目。注意有一些练习是可选的，并且用**'可选'**标记出来了。\n",
    "\n",
    "在此文件中，有些示例代码已经提供给你，但你还需要实现更多的功能让项目成功运行。除非有明确要求，你无须修改任何已给出的代码。以'练习'开始的标题表示接下来的代码部分中有你必须要实现的功能。每一部分都会有详细的指导，需要实现的部分也会在注释中以'TODO'标出。请仔细阅读所有的提示！\n",
    "\n",
    "除了实现代码外，你还必须回答一些与项目和你的实现有关的问题。每一个需要你回答的问题都会以**'问题 X'**为标题。请仔细阅读每个问题，并且在问题后的**'回答'**文字框中写出完整的答案。我们将根据你对问题的回答和撰写代码所实现的功能来对你提交的项目进行评分。\n",
    "\n",
    ">**注意：** Code 和 Markdown 区域可通过 **Shift + Enter** 快捷键运行。此外，Markdown可以通过双击进入编辑模式。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 连接 mnist 的字符来合成数据\n",
    "\n",
    "你可以通过连接[MNIST](http://yann.lecun.com/exdb/mnist/)的字符来合成数据来训练这个模型。为了快速导入数据集，我们可以使用 [Keras Datasets](https://keras.io/datasets/#mnist-database-of-handwritten-digits) [中文文档](http://keras-cn.readthedocs.io/en/latest/other/datasets/#mnist)。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 载入 mnist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from keras.datasets import mnist\n",
    "\n",
    "(X_raw, y_raw), (X_raw_test, y_raw_test) = mnist.load_data()\n",
    "\n",
    "n_train, n_test = X_raw.shape[0], X_raw_test.shape[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 可视化 mnist\n",
    "\n",
    "我们可以通过 matplotlib 来可视化我们的原始数据集。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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/xnkzmu/8sorUbd/9dVXo37e5c6si8SeW3e5M6buzHkqhHn+8+KLL1bZXffZ5d4X0KhRo8A27hrh8XLXB65UqZLKuV0ftm/frrL7733ixIlRj+nOwc+ZMydmnfHimhJb+/btVf7Xv/6lsvv7Khn9hHu+7d69W+XevXurPG7cuISPGUuYrymu+vXrqzx8+HCVY/UYYTFjxgyV+/btq/K3336b9GMyUw4AAABkAJpyAAAAwDOacgAAAMCzYrE3QX6VKVNGZXeN8W7dugU+4858z58/X+Xu3bur/P3336vszpRnZWWp/M477wSOecstt6g8dOhQlXNb2xyZx12DvEuXLnHvw505L4gZ8kyybNmyqO/v2bNH5ddff13lPn36JL0mlzu3vnXr1sA2q1evTnkdSD53HfLHHntM5dzuSUqUO6furkNeunRple+++26V3377bZU3b96cxOoyj/tckkyZIXe1bdtWZfdehTvvvFPlH374IeU15QXflAMAAACe0ZQDAAAAntGUAwAAAJ4xU55C99xzj8o9evRQ+eWXXw58ZvHixSpPnjw5qTV98cUXgdeOPfbYpB4DyZfbmuEjRoxI6j7dewfys7419x+klru27meffZb0Y7hry7tzxu4a4j/99FPSa0DqFS9ePPDa+PHjVT7hhBNUdtcMd69B7u+8FStWqHz//fcHjumuxb93716V3edmnHjiiSq7c+7MlGsNGzZU2b23zYcJEyao/P7778f8jHtulihRIq5juvc37dy5M67PFxS+KQcAAAA8oykHAAAAPKMpBwAAADxjpjyFpk2bpvIDDzxQ4DW4c8GdO3cu8BqQuHPOOSfwWqyZb3fNcPfegSlTpqj86quv5rO6wx8TyVWlShWV3ZnfVatWxdyHex6MHTtW5Xr16qnszpS7a6n//e9/Dxxj6dKlKrvPT0DBq1ChgsoTJ04MbHP++eer/Ouvv6rcqVMnlefMmaPyhx9+qLK79nNezgNrbdTsOnToUMx9FmbuNeOMM85I+TE//fRTlfv166fymjVrVN64cWPMfbrXtiJF4vtO+b///a/K6XrvAd+UAwAAAJ7RlAMAAACe0ZQDAAAAntGUAwAAAJ5xo2cKLVq0yHcJAbFumkF66Nq1q8pdunSJex/ug3zcfboPD3If0pEX7gMZRo0aFfc+kHf79u1TedeuXSq7D1IREWnW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b9T9ITncBxK555s7ixnr/hH3/cqVKwe2cWdE58yZE7NOpM55552nsvtAKRGRGjVqqPzdd9+p3L17d5XdGXLXiSeeGLOul156SeV0mCFHwevdu7fK7vx4bu6++26VfcyQIzFuH5KMGfJ//vOfKr/wwgsJ7zMd8U05AAAA4BlNOQAAAOAZTTkAAADgGeuUJ9GZZ56psjtv667d+eqrrwb24c53nnrqqSpfeOGFKl900UVR3y8I7j/Htddeq/K+ffsSPgZrCgc99NBDKt93330qx1qHPN73c9vGXcs8HdYxz+Q1hXv16qXyyJEjVc5tnfJly5ap7K4rPn369KjHrFevnspff/21yqtXrw58xr1u7dmzJ+oxfOCaknruPHi1atUC26xatUrlVq1aqbxmzZrkFxanTL6mJEOJEiVUXrduncpHHXVUXPvL7T6Cc845R+UNGzbEtc+CwDrlAAAAQAagKQcAAAA8oykHAAAAPGOd8iQaMWKEyrnNd+bkrjMtIvL666+r3Lx5c5Xddclj+eWXX1R+4403Ats88cQTKq9fv17lMmXKqHzHHXeo/Ne//lXlRx99VOU+ffoEjnngwIHDVIzcTJw4MfDaX/7yF5XjXYc83vdz28Zds/7TTz9VecuWLTH3icO76667VB4+fLjK7tx/brOY7du3V9n97zsWdz3gIkX0dznuOSCSnjPkSL5zzz1X5Y8//lhld9bYXSNfJHhflDuPjPQ3evRoleOdId+xY4fKN998c2CbdJwhTwW+KQcAAAA8oykHAAAAPKMpBwAAADxjnfL49qnyww8/rPLf//73qJ//6quvVK5bt25gm1KlSkXdx/79+1V+6623VH7wwQdV/vbbb1U+ePBg1P3nhTtT6s4JZmVlqVyrVq3APvbu3RvXMQv7msILFiwIvNakSROV3f+W3fni//znPyq76+i7/v3vfwdec4/hngtuTYsXL456jFQI85rCbdq0UXnatGkqu//3njdvnsqXXnppYJ/ufSWxuDPokyZNUvmLL75QuUuXLoF9bNu2La5j+lDYrynJ4P7+cc8dV+PGjQOvuevop6MwX1NSwX12wfz581UuV65cXPu78847VX7qqafyV5hnrFMOAAAAZACacgAAAMAzmnIAAADAM9Ypj4M7JxVrhtx1yimnxNzGnbV259bdOd9450Xzo2jRoioPGzZM5eOP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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x270aca9af98>"
      ]
     },
     "metadata": {
      "image/png": {
       "height": 257,
       "width": 370
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import random\n",
    "\n",
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format = 'retina'\n",
    "\n",
    "for i in range(15):\n",
    "    plt.subplot(3, 5, i+1)\n",
    "    index = random.randint(0, n_train-1)\n",
    "    plt.title(str(y_raw[index]))\n",
    "    plt.imshow(X_raw[index], cmap='gray')\n",
    "    plt.axis('off')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 练习：合成数据\n",
    "\n",
    "你需要随机取随机张图片，然后将它们拼接成新的图片。\n",
    "\n",
    "你需要设置20%的数据作为验证集，以保证模型没有过拟合。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "n_class, n_len, width, height = 11, 5, 28, 28\n",
    "\n",
    "def generate_dataset(X, y):\n",
    "    X_len = X.shape[0]\n",
    "    X_gen = np.zeros((X_len, height, width*n_len, 1), dtype=np.uint8)\n",
    "    y_gen = [np.zeros((X_len, n_class), dtype=np.uint8) for i in range(n_len)]\n",
    "    # TODO: 随机取1~5个数字，并拼接成新的图片\n",
    "    for i in range(X_len):\n",
    "        rand_len = random.randint(1, 5)\n",
    "        lis = list()\n",
    "        for j in range(0, rand_len):\n",
    "            index = random.randint(0, X_len - 1)\n",
    "            # 将对应的y置1\n",
    "            y_gen[j][i][y[index]] = 1\n",
    "            lis.append(X[index].T)\n",
    "        # 其余位取空白    \n",
    "        for m in range(rand_len, 5):\n",
    "            # 将对应的y置1\n",
    "            y_gen[m][i][10] = 1\n",
    "            lis.append(np.zeros((28, 28),dtype=np.uint8))\n",
    "        lis = np.array(lis).reshape(140,28).T\n",
    "     \n",
    "        X_gen[i] = lis.reshape(28,140,1)\n",
    "        \n",
    "    return X_gen, y_gen\n",
    "X_raw_train, X_raw_valid, y_raw_train, y_raw_valid = train_test_split(X_raw, y_raw, test_size=0.2, random_state=50)\n",
    "\n",
    "X_train, y_train = generate_dataset(X_raw_train, y_raw_train)\n",
    "X_valid, y_valid = generate_dataset(X_raw_valid, y_raw_valid)\n",
    "X_test, y_test = generate_dataset(X_raw_test, y_raw_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 问题 1\n",
    "_你是如何合成数据集的？为什么要分训练集，验证集和测试集？_\n",
    "\n",
    "**回答：**\n",
    "- **设定一个list长度为5，随机取n个数为有数字的类型，其余数字为空白，标记为第11类（编号为10），实现了左对齐的需求。根据Reviewer的提示，lis的每个数是原矩阵的转置，拼成一个140*28的矩阵后整体转置，作为X_gen的第i个数，直接赋给X_gen[i]，运行识别原来快些，lis想不出怎么去除了，似乎还得append。**\n",
    "\n",
    "- **训练集是用来训练模型的，验证集是用来对训练的模型进行进一步调参优化，如果使用测试集验证，网络就会记住测试集，容易使模型过拟合，测试集用来测试模型表现。**\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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54ADDtBNmzbpihUrdMWKFdqoUaOc/2827HxD2HkyV/m1TZs22qZNG128eHFUXhwzZoyOGTNG69evn5f9W7lyZa1cubJeeeWVumjRIt22bVvcwY8vdvrEiRNzHmO7du2C80jktj///HNt165d6MeoPzRp0kSbNGmiX331lb755pvasWNH7dixY9QyQ4YM0dLS0mBYuHChHnDAAXrAAQeEHn82hrDzZHnybNWqVaPyYibDww8/rHvuuafuueeeednfBxxwgI4fP17Hjx8fdVzFDitWrNCffvpJf/rpJ126dGnSZf0hWzGecsop+vXXX+vXX3+tjzzyyHbz+/btq3379o3aduPGjfN+7LZt2zbufiguLtb99ttP99tvv9DzV7t27YK4Nm7cqBdccIFecMEFwfxBgwbpoEGDdMKECXnNs9am3BhjjDHGmJBZ85Vy2H333bebNmfOnKw/+T906FCqVKkS3OZOp3uevfbaCyi8XhOMyYY2bdoEt7wbNWoU3M796KOPuPTSS/May7Zt2wC48847mTJlStAmMZb/rMqxxx4bNf3EE08MXkh2zz335CTGunXrUqdOne2mT548mYULF+Zkm+kqKiriuuuuA6Bly5a0bNky6N6yZcuW7L///gDcdNNNUetde+21QTdmJlx+bxvxqCrr168HXHvnli1bBvMiezzr27cv8+fPB7b/rnOhRYsWSeP21atXL2iqtiORz56VR+vWrQHX9MzvnvTpp59Ouo5fDvHuauRN7dq1gyYq/vaXLl0KuJcr/vjjj3mNJ5bf7DjyOcDLLruMcePGBeOVK1fmzDPPBMh7m3crlGeoVatW/PnPf95uei76Dffbib3yyis7XLZy5cpcdtllAPTu3Ts44d12222MGjXKugozO4399tuPN954I7hIAcGJ1X9oJyyzZs0K2pPGmjBhAkDQLtVXVFRE8+bNcxrX7Nmzeeutt4DoHwVXXnklJ510EscffzxAqF2oNWzYkMsvvzxq2htvvBH87b+ZtUaNGsG0L7/8kqeeeio/AZod+uKLL4LjvHXr1sFD1vfddx8//vgjb7755nbr1KhRgxdffBGAE044AShrjzx8+HA2bdqU05jffPPN4IHEtWvXRs377LPPACguLt5uvXXr1gFl3RRHird8uqpXrx4c240aNeKLL74Aort89UU+S+O/T8AvEOdLr169ot7vMn/+/KCs9N///jevscTjPwPQvn374Dw3ceLEqGVOPvnkYF/6zynlizVfMcYYY4wxJmxhPyxSiA+OJRoaNGigDRo00D/+8Y+6du3auA+n3H777Vnf7vTp07WkpETPO+88Pe+885IuO3bs2LhxlZaWaoMGDUJ/uMKG8Iaw82S282vv3r2jjvEpU6Zo/fr1d/hgZ/369fW0007T0047TW+88Ubt1q1bXr+HE088UU888cTtHvRcsmRJXh5UbNSokTZq1EgHDRqkxcXFWlxcHMQwa9YsnTVrlvbp0yfvx2etWrW0Vq1aeskll0Q9HLZgwYJgXsOGDXXOnDk6Z86cqGWuueaa0PJVroaw82QY19h69eppvXr19Ntvv43K29dff31e9vlxxx2nxx13XNSxNWrUKK1Zs6bWrFkzlOOgTZs2UfHceOONeuONN263XK1atXTBggW6YMECLS0t1XHjxum4cePyFqd/7vXLK368bdq0CWW/JRomTpyoEydO1NLSUj311FP11FNP3W6ZcePG6dy5c3Xu3LlaqVKllNPORr6y5itp8Nt13XXXXdSsWTNq3ujRo4GyvsyzSUSCIZk//vGPDBgwIBjfsmVL0D2j/8ZRYyo6v4nFfffdB5S15b7hhhtYuXLlDtd75JFHorpo27p1K4899hgAF198cU5ijuQ3v4g1fvz4vLSJ9p9JGT16dPAGzIsuuohbb701OMcNHjw4aKufr6Ysbdu2BeA///lP1PS77roraCJw0EEHcfDBB2+3rt/swVRsq1atAuDdd98Nnh0Al2f8Nz/G6x4zG9q2bbtdMwZwz4D4545483Mt9n0p/jsDYlWtWjXoahLKmq/ki983+lFHHQW4blUBZs6cmdc4kmnTpg3du3cHYP369XGbBJ9yyin07t2bu+++G8jd8ZaINV8xxhhjjDEmbGHfAqtIt9Y6d+6snTt3DpquzJ8/X+fPn689evTQKlWqaJUqVXJyu2VHzVfatWun7dq1040bN2pJSYnee++9eu+990bdprfmKzaEnSezkV/r1KmjH3zwgX7wwQfB7dHu3btr9+7dt1u2YcOG2rBhQ+3SpYtOmTJlu/5y/WYbqqqzZ8/W2bNna926dXP+PcT2U75y5UpduXJl6H33dunSJSq2mTNn6syZM3X33XfPy/b929+xfRt/9dVXOmPGDJ0xY0Zwaz52mDlzZt6bIeV6CDtPhnGN9Yf+/ftv1wQzl9dYQM8888yE/YyvWbNG16xZow8++KBWrVo1r8fBoEGDomLx34cQb59FLuef//IV58KFC3XhwoVaUlKiy5Yt0/79+2v//v11xIgR2qVLF+3SpYsedthhKTUxzNXw2GOPBfvnhhtuiLvMhAkTdNmyZdq+fXtt3759WulnI19Z85U0+G928puu+D0CvP7666HFVKlSpeBthdWqVeO9995j8ODBgLstH/mK3d/+9re8++67YYRpTMaaN28edI02ePDgIB+qKtOmTYt7TDdv3jy4fduiRQug7MnpeNvPAAAgAElEQVT/+++/n++++w6ADz/8kLp16wbddOXibbyR/G62In355ZcAoXcV9u677wavqS8tLQ16fTrrrLOCpkJhiOwyL5FDDz2UiRMnBr3XJGvGZCqel19+OefNCJL12OS/+fbCCy+kTp06nH/++QChvJHSf6Nn7LkqtomqH/Py5ctzHlO3bt1o2LBhMH7HHXcEvTsdd9xx/PWvfwVc73C//PILACNGjOD+++8PeubJtV69enHBBRcEzX9uueWWqPn+m9x79uzJeeedl7CZUK5ZoRxo164dQNAXbjz9+/ePattVXFycs76EE2nVqhXguk7zuzY86qijovpDHjZsWNRB7rfTBCuUm4rpN7/5TVAoP+uss4LpS5cuZciQIcHr4IGg661rrrkmaF85efJkXn/9de69917AdSv26quvAq7fboD//e9/uf9HIG6Xh4X0DgG/P+gbbrghmHbxxRfz0ksvAbBkyZKcbXvNmjWA64v5wgsvTGvd9evXM3bs2O26sjMVk/+Kc9/ixYtz3p2vf/z5vvrqKwAOPPBAKlcuKyqdc845PP/880BZ96a5FNt16jXXXAO4fvkj98lpp50WtdyDDz4IlHUvmUv/+Mc/ovbR559/zpQpUwDo06dPUHbq27dv0NXgPffcQ8uWLYN3M+RKpUqVgjh+/vlnzj777O2W6dy5M/fffz/g2uz757swWJtyY4wxxhhjwhZ2u7R8t3erUqWK/uEPfwjaXT/++OO6YsUKXbFiRdyuBBMNRx99dN7aQY0fPz6qi6Gzzz47mDdw4MAgpk8++SSqzV2dOnV08eLFunjxYi0tLdVTTjkllHZcNhTGEHaezEb71NmzZwfH+4cffqiAioiKiP7lL3/RrVu36tatW7WkpEQnTJigEyZMCLoYbNy4sTZu3FgfeeSRII21a9fqXXfdpZUqVUqr66tMh7/+9a/q82Pw4wz7+AC0du3aWrt2bX3nnXeiumscMGCADhgwIC8x7LHHHtqhQwft0KFD0EXknXfeqXfeeWdUm9n//e9/wfy999479H2X7SHsPJmtPJvJ8Pnnn0ddb2+66aac7+8GDRoE7Yjbt28f5IUjjjhCR48eraNHjw6OvWnTpum0adPy8pxWtWrV9Pnnn9fnn38+6vh/+umntW/fvnrppZfqpZdeqitXroya37t3b+3du3dejtXI7c6YMSPpsv4zQKWlpbpw4cKcx9anTx/t06ePlpaW6sMPPxw1b5999tF99tlHly9frhs2bNANGzboEUcckfG2spGvdpnmK34TlfHjx7PffvuVO72nnnqKUaNGAa4bxI0bN5Y7zUQuvvhijj322KDN2JgxY/jhhx8AorpKXLZsGVu3buWII44AYOzYscE6IsKHH36YsxiNCYvfrV///v2DtsTPPPNM8GxFmzZt6Nq1a9Cu8ZBDDgnaWf79739n7NixeY039vXXhdRlmN/849lnn416O6B/y9e/xZtLK1asCM6nfpOCvfbaa7vlPvvss7x0IWnyx79e1a9fHyhrLuXn8VxasWJF3HbEn3/+OVWqVAEIziF+3mjevDkrVqzIaVybN2/mqquuAtxzbX6zvF69etGrV6+46yxatChoYpMv/vns0ksvTbqcXz7xl881/9y1YMEChg8fHjXvnXfeAdzx1rt3b8B932Gy5ivGGGOMMcaEbJepKX/zzTcBqF27Nh999BEff/wx4F5M4WvZsmXQo0qs4uJivvnmG8C9hGSfffYJOpc/9thjg19ZkQ+dZcuaNWu49dZbg1gbNmwY9Pjy9ddfB784Dz74YO6+++7g13Pjxo2DedOmTWPDhg1Zj82YsLRu3Zrp06cHNS9AcNfo8MMPZ/r06YDrmSPS8uXLgwdG33///TxF65x77rl53V5F1LFjx+AlMjNnzqR58+ZRD/j6Is/dZufg94DhPxA9Y8YMILsPQ/udHwwZMoSBAwcC7qHxQubfEerSpQt/+MMfADj99NNp27Yts2bNAuCwww4Lln/55ZdD6RkGYNOmTQnntWrViiFDhgTjc+bMyWksnTt3DjrCePHFF/n222+DlhIvv/wy++yz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BALiEn68sLAwJLz11lty5ZVXypVXXpmSZ9ygQQN54YUX5IUXXpDPP//ce27ffPONBAKBqM+8uLhY5s6dK3PnzpV69eolTZ6ePXtKz549JRAISEFBgRQUFEjfvn2lSpUqEdNff/31Xrrdu3dLp06dUqoT/fr1kylTpsiUKVPieq+4YeXKlVK7dm2pXbt2yvU2HcFvnUyVzh500EGyadMm2bRpU4hefv3113L11VfL1VdfLU8++aQUFRXJ1KlTZerUqb7c//z8fMnPz5dAICAff/yxfPzxx3LWWWfJeeed58n80EMPpaMcePhdJmOFLl26SJcuXeTjjz8upZsbNmyQDRs2yKJFi2TZsmWybNkyKSoqkr59+/oud5KfVYX1Sm3KFUVRFEVRFMVn9nvvK4nw3//+FyC4pyAtXHTRRRx88MHe/rfffss999wDWDOL9evXp02WYI499tgy0/zvf/8DrJwuHTt25KCDDgLsMHk66datG2+88Ya3v3XrVs4880zAPt+bbroJsEOplStXTqksAwcO5M477wQoZcKwatUqHnvsMQDGjx/vDZH+8ccfHH744Z5py4wZMxg1alRK5dyba8a54QAAIABJREFUcO3I586dyyeffOIdb9asGaeccgoAixcvJicnB4B69erx+uuvp8TNqWtWdNBBB/H3v/+9VPxxxx0HlOjI77//Tps2bULSHH300YA1TevRo0dI+vLQsGFDb05KYWEh5557LgCffvpp1HMeeOABCgsLAWsHevPNN3POOecAJM0DVbVq1bj++usBuPHGG0PmB4Tjrly8cuVK7x4effTRNGnShIcffhjAs9NXMouDDjqIefPmeeZQa9eu5eKLLwbsu6y4uNhL26BBA/7yl78AUKtWLX7//fe0yXnFFVd4ZnHTpk2jT58+gK0vsrOzPVeirne2/Z28vDwmTZoEQP369YESk6N7772X77//HrAmcq7p0ty5c7nuuuv49ttvgRLXzvs9fg+BZdrQWqwwYMAAGTBggBQXF8u6detSPhRSq1YtqVWrlqxYsSJkmK93795xnd+gQQPp2LGjdOzYUV5++WUZMWKEZGdnS3Z2dtJkPOigg2KG+vXrS/369QWQmjVrSs2aNWXu3LnesNaoUaPSMqzUvn17ad++vSxYsECKi4tl/vz5Mn/+fDn88MO9NJ06dQoxHejZs2dKZdq4cWPI9V599VVp166dtGvXLqa5QnZ2tjRu3FgaN24subm5cV/Pb51Mhb5eddVVsmbNGlmzZo0EAgHPHCgdZaqssGLFClmxYkVM85RAICCrV6+W1atXy8SJE+Wdd96Rd955R2bNmlUq7UknnSQnnXRShWQaMmSI9x5Zvnx53OcNGjRIBg0a5J2b7PvcokWLqGYp48aNk0aNGkmjRo0kNzdXKlWqJJUqVRJAmjZtKk2bNvXS/vbbb/Lbb79JtWrVfH/+FQ1+62QqdHbUqFESCATk/fffl/fff1+aN28eEl+1alWpWrWqXHXVVfLDDz945e3QQw9Nyz1v2bKltGzZUn7//XevTHXs2NGLb9eunVx88cWeedX48ePTUQ488vPzveN5eXmeiU1+fr6IiMyYMUNmzJgRki6VoVWrVtKqVStZt25diM4OHDhQcnJyJCcnp9Q51apVk2rVqnlmLu699EPHUvCsKqxXar6iKIqiKIqiKD6j5isJ0L59e+93qhfTyM7O5pZbbgFKZqp/+eWXAGW6RHLlvO++++jatWtIXJcuXQDo3r17UlbwS2QovV+/fkDJkDxY11eppkGDBt49y83NZfv27Vx++eUAGTPz+6233qJfv36emUAsioqKWLt2bRqkynzGjBnD2WefDVgToAYNGvgskXU1OHHixFLeJFx+++037/eOHTs8l43Bi38dcMABtG/f3jMvueSSS5Ii2+GHH+79njhxYtznvfvuuwDs2bOHnJwcWrduDcD8+fOTItfrr78esv/rr78CdqG2GTNmRDTRO+qoozw3sS6uWVLjxo355ZdfkiKbkjy6du3Knj17OP/88wFb/oNxn6drOuJ6HFuxYkXKZcvKyvI8rNWoUYMHH3wQCDW9nDp1aoipYXj5SzW33347t99+e9T4vLw8bxucLlWuFF0va8Hv3WeeeYaJEyeyZ8+eUunbtGnjmSS5bRElFG2UlxNXeVNFtWrVGD58uLe/fv1670UWzYa8fv36PProo569Z7AfYpfOnTsDUKlSpWSLXCZjxowBQET4+uuvgRL70FTgfpzMnDmT3Nxc7/itt97KF198kbLrloXrEq9KlSresR07dsTVIHc54YQTAOjTp09G++FOB67tYrdu3bwGeiwb6VRz/vnne/MUwhkxYgTvvPOOtx/ND/OGDRt4//33PReFF1xwQdLldG0548F9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S4tZg7uU9HvvvRfVJaKfBAKBkPKeCO6cENc+1B2qThYFBQWe7pXFpZdeChByj2+55RbWrVuXVJmU1HDBBRd4poKnnHKKN0F93rx5nvmKiKR9AuAHH3zgmVANHz7cW8NixIgRzJ07F4CqVauGTEJOF679uPMxBNi6X0Q8E5RPP/00ovnKjBkzotqXp4PTTz/dM3sTEc/c8oknnvBNpkxGzVcURVEURVEUxWe0pzwC7iTBSy+91Js41qdPn5S5yIuGe22AZs2aed4XevbsGXHBmIULF3LppZdy2GGHAdbjSu3atb34CRMmeF+ngUAglaJ7BPdmue6TgldISxZHHnlkyGqFUDKR7aWXXvIWYYnlnSHYK8vvv//OnXfe6blYa9euHbVq1QJSu7qcuyjQ6NGjQ3rI3Ylut99+u68LH2U6rseVAQMGeCvHnnfeebz44ospv7a7gl2mTjYsKiri008/jbrSaDROP/10b+EvsIv2LFy4MNnixcWRRx7p9aiLCFu3bgXSszKwkhwCgYA3WdHPRb4i4b5bg9+xTZo08bz//PHHH6UmK6aTrl27lvK2FW0VT7cH3a9e8l69egGELIJYXFzsjYAsXbrUF7kyHr/t0jLN3u3RRx+V3377TX777TcpLi6WV199VV599VWpXr16Wm2TjDEycOBAGThwYIh9WyAQkG3btsmePXtkz549peKihauuuirt/+Gmm24KsSEbPHiwDB48OCXXuvLKK0Ou9dZbb0mLFi2kRYsWcecxceJE7/z77rsvrfcKkB49esjnn38un3/+ech/+eyzzzyb3ork77dOJktfb7vtNrntttukUqVKUdOcd955XtnfsmVLWp6faw/rPrdMsykH5Mknn5TVq1fL6tWrpV69ejHTtm3bVtq2bSurVq3y7uWmTZukSZMmvsnft29fKSgokIKCAikqKpLp06fL9OnTfb+vqQh+62Sq6thooVq1arJ06VJZunSpBAIB6dWrl+/PAJDu3bt75f+7777zXR7XHry8JGKLXt5Qv3592bBhg2zYsEGKioqksLBQCgsL5fbbb/f9/qUyJEOv1HxFURRFURRFUXxmvzdfycrK4oYbbgBg6NChNGzY0O0FAOzQLcAvv/zimZMsXbqUDz/80PMV/csvv3gTCV0TjYoiIt7CIUCIg/3q1avHlceiRYu46667ALtgTbpMVlyOOeaYkHv51FNPpexakyZN8sxVVq5cyezZs71nUh5StXBQOK6f5VNOOYUJEyZ4+zt37vTMfPr371/maq77E/PmzQPgr3/9a6nVAV3ee+89b5i5YcOGnHjiiSn3L1wRf+QuhxxyCGAXk5o9e3aF8wtn/vz5XHbZZYA1kbr44osjpuvZs6e3umzwZPehQ4eyZs2apMtVFu6qjxMmTKBSpUrecT8m3SmpoUmTJqX802cCwetXZIKZlDuZc+bMmXEvHBe88mc61ll58cUXPf/zQMikWSU2JrjRtC9hjInrjx1wwAHeQgbOeUS7J26jPFK8u3rftGnTGDduHB9//HHCMkfDGEODBg08zynBNG3alIEDBwL2hbFkyRJPUSdNmlShhmlFmTRpEuedd563n52d2d+AEydO9Ozgjj76aK/xl0reeecdoMS7hTsz/aabbgr5KEsGImLKTuUP8eorwKOPPgrARRddRK9evTxvPj///HNIeXc/qD/44AN++uknzwPA7t27kyZ3MK4Np1uJu43a0aNHe2kKCgq8hUgKCgqoV6+e502ncePGnr33/PnzQ1aYTRaHHXaYVzkHv/smTpzoHQO7IqrLnj17vHt+4403Rn0/ppLevXsD8PLLL3vXnz9/PscffzxgbX33NTJZXyExnY2HwYMHe96TwH5Mp6tzJBaffPKJZ5ddu3Ztr67PNPLy8kLsx90VSkeMGJG0RYJi4b67jjvuOMaNG+fZ4QMcfPDBAKxatSrlcvhJMnR2v2+U16xZkzlz5gB2gtbbb7/tVVDROOSQQzjttNOixm/fvp2bb745AWn3PWrWrMmnn37KUUcdBVgXfx06dPBZqtgEN8pr1qyZcreR3bt399yB5ebm8scff9C+fXsAFixYkPTrZXIlX54K/uuvv/YmxoIdpbrnnnsAuP/++73VZF13Zm6lkaqKvlOnTkDsyWsffvih97Hw4Ycf0q1bN6+RuXv3bm9idConwLlyTp8+PeYS2G5D9/LLL+e5555LmTzx4LpgPPfcc7371b9/f1577TXATiDb18hkfYXkN8o7dOgQ4gSgWrVq3uRpPwlulNesWZMdO3b4K1AG0rBhQyZNmgRA586dQ+KGDx8e0jGxL5MMnVWbckVRFEVRFEXxG79ncKcqkAEzcffn0L9//xAPIulcPay8Idj7Sm5ubsqvt3HjRu96u3fvlgsvvDCl1/NbJ5Otrzk5OfLPf/5TPvvsM/nss8+kuLjYW+Fx5cqVsm7dOlm3bp0EAgFZuHChVKtWTapVq5ay+5udnS3Z2dnywgsvyAsvvOCtDhhrxVgR8X5PmzYtreX90EMPlfnz58v8+fNLeWuaOHGi9O7dW3r37p1WmSKFfv36yaZNm2TTpk1SXFzseejo1q2b77KlMvitk+muYwcPHhxSBnNycny9/9WrV5fq1avLzp07vRUps7KyfC8XmRheeOGFkJV4i4qKZOjQoTJ06ND96p4lQ68y28hX2Wu59dZb3Rc3sPdMyProo48A0jJsOnXqVPr37w/AkiVLvInDSnzs2bOHhx9+mIcffhiww6RHHHEEAKeeeqpnH/3jjz9y4YUXptx/uGvPnp+fz7Jly7yJpSeccIK32mRhYaFnFvLss8/St29fzxd+Ouw+g/n5559p27ZtWq+ZKA0aNOC2226jTp063rFffvkFwFvBV9k32LJli98ihOCuml21alUeeughIH3re+xtBE/qBPsudufU6D1LDDVfURRFURRFURSf0Z5yJSW0bt06pKf8zTffpFmzZj5KFB/u7PB0TBwLdkfXv39/6tat63lfURJn1KhRfosAwLJlywDo27cvAM899xxDhgwB7CTw7du3A7Bu3TpvYqoSHzt37vRWJVb2Ld544w2+//57AD777DPfPeqcf/75gJ0Y/sknn/gqS6bzz3/+0xtl3rZtG88///w+Ofk6Hez33leU1HD55ZczZswYfv75ZwBGjhzJK6+84rNU+zeSwd4cVF+VaIwaNYqhQ4cC1o2k63HHNWPZV8lkfYV9X2fvv/9+wJoWBrtqVJRoJENn1XxFURRFURRFUXxGe8oVZT8hk3veVF8VJZRM1ldQnVWUcJKhs/tso1xRFEVRFEVR9hbUfEVRFEVRFEVRfEYb5YqiKIqiKIriM9ooVxRFURRFURSf0Ua5oiiKoiiKoviMNsoVRVEURVEUxWe0Ua4oiqIoiqIoPqONckVRFEVRFEXxGW2UK4qiKIqiKIrPaKNcURRFURRFUXxGG+WKoiiKoiiK4jPaKFcURVEURVEUn9FGuaIoiqIoiqL4jDbKFUVRFEVRFMVntFGuKIqiKIqiKD6jjXJFURRFURRF8RltlCuKoiiKoiiKz2ijXFEURVEURVF8RhvliqIoiqIoiuIz2ihXFEVRFEVRFJ/RRnkGYSz9jDEfG2M2G2N2G2OWG2OeNMYcXIF8c4wx/zTGfGmMKTDGFDr5f2aMucYYUyUJsncxxrxojPnVkXujMWaOMeZBY0zLBPMaYIyROMPycsh6lDHmCmPMM8aYn4wxRU5eExPNS8lcjDHNjTFDjDFTjDErjTF7jDHbjDE/GmPuMcY0LkeeLRIom2KM+VOC+R/kvAMecvR1p5PPugTyqGWMudMYs9A5f7PzTjk/0f8blGeOMaabMeZWY8zbxpg1Qf/xjATy6WWM+cSRaacj453GmJoVkK3C+myMae2c75aTNcaYicaY9uWVSylNKuo4Y0wDp1zd65StrUFls2qceVQxxtxgjPnBGLPdGLPFGPO1MeYyY4wpp1xZxpiuTr6vOv/TleuKBPI51XmHbXDu1zJjzMPGmAPLI5eTZ2tjzCXGmMeNMd85ZV6MMbMSyKORI8cyR671jpynVECumsaYHsaYkcaY940xm4Lu2eFx5mGc5/a18xy3GWO+N8YMN0lo66QcEdGQAQGoDLwFiBMKgd+C9rcBfy1Hvg2BH4PyEWBL2P73QP1yyp0FPBGWX4Ejv7vfP8E8ewPryghu3q+XQ+YfwuR1w0S/y4GG5ASgGRAIe75bgaKg/d+AruXIt6yyucfJfx2QnWD+D0Upm+viPP8g4Jew90awLj5RzvvZLopcApwRZx7jwt5v24L2lwFNyilbhfQZOA3YEfZ+DATJmdD7S0PU+5yqOm5IjLJZNY7zawGzg87ZEaTDAkxJVI+dfOvEkOuKOPO4JeicYucd5u5vAI4s57N4K4pcs+I8/yhgU9B5Wx35xNGdm8op17kx7tnhcZax94LO2QPsDNr/Fqjhty7ECtpTnjncC/wN22gYCtQWkXrYRsBrQA3gDZN4794jWAXaDVwG5IpIHaA68A/gD2yFO6qcco8BrsC+UIdgG/d1garAIcB1wK+JZCgik0SkUbQAdA9K/lw5ZC7EVuRPA5cD08qRh5LZVHK27wG9gHoiUhvIBc4ElgN1gbeMMY3izVREVpVRNpsBvzvJXxKRogTldhuok4BhwIPxnuj06L0OHAysAE4SkZpATeAGbGV5hTFmcIIyuWwBPgbuARLqdTfGXAkMdmQYjq0YawInYd8PLYFXyylXufXZefavY8vFdKCF835sBLwEZAPPGGPallM2pYRU1XEC/A94E9uI/VeC5z8FtMd+IJzjyJELDMDWm2cDIxLM02UH8DkwGvg79kM9LowxZwJ3OrsPAHWcd9iR2PLeEHjbGJNTDrmKgYXA88C1wAsJyFUNeAeoj+3QO9KRq64jpwH+Y4w5vRxygf3YmIq955cleO6d2Pf7buzzy8W2dc7BPt/jgbHllCs9+P1VoEEADqDky/zeCPGVgAVO/JgE8s0Jyve2KGnynfgt5ZD7NOfcIqBTGu+X25u4nvL1YFQK25+A9pTvUwGoDRwdI/5wYJfz3G9P4nWDe3qOKsf54WVzAHH2lAdduxhoFyF+tBO/FqiSoFxZgAk7FldPufMeWu+kfTBC/DGU9Eyfk4R7Frc+B71LVhLWg+a8d90e1MnpKLf7akhVHRfl+ecFlc2YPeVO2XPT9ogQ/08nbidwQIJyGSAr7NgK4uwpp2QE6M0IcQdRMtJ0TTmeR/g9yyfOnnJKRia2AU0jxL/pxM9Jglwtgp5PzJ5y7If0bifttRHi/0ZJT37C7+Z0Be0pzwz+Cri2TqPDI0WkGNvjDdDXGFM5znzrBuX7fZQ0c5xttXLYzrk9Es+KyBcJnlsujDHZ2B4HKF9PpHs/lX0YEdkqIj/GiF8EuPaTybQbvtjZfi8iPyV6cgXLZj9n+5GI/BAh/n5spdQI+85JRK6AODVbOTgV2ygTbE9aeN7fAx85u/3C4+OQrVz3zBiTBfRxdp8Qke0R8nVHKs42xtQqz3UUIHV1XEV1xq1LFovIOxHix2FNM6oB/5dIxmIJlEcoZ2TmaGf3vgh5/w94xdlNm86EXe9lEVkdId4ddT82XjvwJMl1HrYDYCv2uYXn/TbwM/Zj6e/h8ZmCNsozgz85260iEm14a5GzrQscG2e+G7C9gWB7BCLhNkh+SKTSNcY0xfZIgO2ZShdnYoftoHymK4ristnZVoqZKk6MMfWBs5xdP8pmnrONaL7hVKDznd2EGuUVpKuznRelEocSmdMpVxvAnSwXzeTlQ2dbBeiUcon2XVJVx1UUt2x+GClSRHZhzU/AH53ZCnwTJY1bZjsYY2qkXiQ7EZOSNkM0nZmFlRv8uWeficjuKGnc55xOuRJCG+WZgdsYjvU8soN+x2Xf6HylP+Ps/ssYc6ljD4YxJtex87wZa1d+Y2Ii09HZ7gHmOLOd5xhjdjiz3782xlyVSI9HnLg9kT/G6glVlFg4Iy4nObvzkpTt37ETjQqBl5OUZ1wYYw4AGji782MkXeBs26RWohDca8UjV0NjTIMY6ZJJ8D1YECmBiGzCdm6Ep1cSIyV1XEVwRobdntxM1ZmFMXrbXbmC/0eqOcK5HkS5Z468i53dTH3PHFFerzqpRhvlmYE7EbKmMaZZlDTBhbtJAnnfCEzGTrx8CthhjCnATkAZA3yG9UAxMyGJobWzXQ08i508cSy2kZ6LbbQ/BnxsjKmeYN4RcXoiz3Z2JyQjT2W/5SqsGUcAO9kpGQxwtlNFZGOS8oyX4Mlxa2Kkc+MSdgdZAdxrxSNXcPpU417ntxg9a+DPPdvXSGUdV15qYScBgupMvOwr75kaTsg4tFGeGczA9lZDhB5rx7fmkKBDcfv0FZGdQH9K7NIM1lWT+7smJT1sieDmcTC2h3Ay0FzsbPpajrxFwMnYyVTJoC92GLmINPdEKvsOxpijgLud3cdEJFbPSrx5HknJkLsfpivBH767oqayE9YgvRWSK1s8ckH6ZItHLvDnnu1rpKyOqwCqM4mj9yzFaKM8AxCRDcCTzu4/jDF3GbuISGVjzDFY90AHY4fFwfbuxYUx5lDgJ+B67ESvNtjC28bZPw7rFi7uxQwc3LJjgCVAHxFZ5fyfXSLyMCWN8QHlcHMVCdd05X3nnilKQjjl8C3saM4cEjfbioZbNjdj3TCmm+Ch2PJOyEwVrmwq135KKuu4CrC364wfMmekyUca4UWDAAAgAElEQVQYmfYsE0Ib5ZnDDdhFCgzWq8kqbM/CXOAUrKnJL07aLfFkaIyphG2AtAbyRWS4iCwUkZ3OdjjWF6gBRhljGsbKL4xgTwWPR/GC4nouyKZkElq5MMa0wX5AgJquKOXAGFMPO9HnYOyH5FllmC3Em28lQj0S/BErfYoI1sfcGOncuO0x0iQb91rxyBWcPtXEI1dwfDrv2b5I0uu4CrK360xwr3W6dQasR5po+HHPdoRdOxJ+vGcSQhvlGYKI7MH60bwAeBtYil3g5H2sK6YhQHMn+ZI4s+2GnZghwMNR0ri92TWwL8Z4CbbbWhwpgYispWQhlWh2hPHi9kT+BrxbwbyU/QxjTG2st4AjsT6pTxWR9UnK/nRK7Bn98ggUrI+x7HHduLUplCUcV7Z45IL0yebKVc/EXo7dj3u2z5GiOq4i/E5JQ051Jj72lffMdjK0UZ5ddhIlXTguCV9zQgjGmA6UfJnOCo+PwhHOdpOIbItyzW3GmI1YN4MtEhA32A43nuGicg8pOT2R/Z3dV3zqiVT2UpyJxlOxIy3rsA3ylUm8xABnO19E5sRKmCpEZKMxZhN2fkhborsrcyfTRfQ2kiIWYF2ZxvKo4cq10fF4kg6C70EbbI9tCI4nmAMipFfKQQrquArJYoxZiH0vxFM2060zYL2EZEXxwOLKJdjVOdPBIud6BnvPSnXIOf7/D3N2033P2hDfs1xYgXUXUor2lO89DHS2M0Uk1uziYFxFrm+MiTik4xx3J3pGbLhHYTYlQ4wR3TEZY5pgJ31Cyez78nAaJV+4EyqQj7Kf4bgAnQKciLX3PlVEktYLZ4ypA/RwdickK99yMsPZnhYp0llbwK2wPk6LRBZXrrbOOyES7pLc6ZRrIXalUYhyz4KO/wGkZYG0/Zjy1HEVpSydqYp1VgD+6Ext7NLwkXB15hsR2RElTVJxOvdmO7vRdOYErNzgzz07OcbIlytzOuVKCG2U7wUYY/4CXOrs/ieBU10/3lnAoChpLqVk8ka0RQpKISKFwKvO7lWO3+dwhjrbPcAn8eYdAdd0ZYGIzI6ZUlEcHI8Ob2AXldgCnJ4MTyth9Ma6Gy0GXkpy3onieiQ63RhzdIT467C6vpaSCiwdfIz19Z3lyBCCI+upzm7a7qHT+zjR2f1HuOtWp8fPfYdNEZHfUVJCBeq4iuKuinm4MebsCPGDsQ3MXdjl49OCiCygpP4eHh7vfNz2dXbT/d5x3zP9ojhwGOZs54hIRNPWFPEGtq1Rh5Ky5GGMOQfbgy+UPPfMQ0Q0ZEDANhyGAi2BSs6xusA1WNs3AcZGOVeckB92vBJ2SEewroCuB+o4cXWc/Z1O/JcR8m0RlPeACPFNg2R7HTjIOV4NuBY7k16AURHOzQvKOy/GfXFfiALcEOe9HBCUd4sI8e7ogBtecdK+EXa8RqJ5a8iM4JT9153n9DvQMcHzI+pUhHRfOemmxplvWTpVOawMXu2kXR92vG6Ecw122F+wE+Y6OsdzHF0vduIGR5FtphM/M0p83TAZ3P9xQdjxyhHOvdJJW+zIkuMc/4sjqwBfRLluKvW5EXb1QcGa/DR3jjfE+q8XbEXftiLlRENq6jgnLivsOf8tKH3T4LgoeU9y0m4CznSOVQIuoqR+vCvKuROc+BVR4muHybbSSX992PGcCOeeGfQ/7gNqOsfbYD1HCbAsyrl5QefmRYjPCbv+fU7a2WHHa0c4txqwwkk/B2jjHK8ZlI9gO0Ei3RP33AlR4oOvf0xQfh3D4rIinHsvJe2dC4PK2ZnO8xXgpSjXzXev5aue+K2oGrwCMSCo8BUCBVjzE/fYU24Bi3BurBdWG+wCPxIUfg/bX4JTGYWd2yIozYAo1z4NO2FCHHl/ww71uue9ReRKOuZLIyjdYCdNEdC4HPeyRYT4fEL/f7QwIdG8NWRGADoHPaddWFvyaOG7COeX2djCejXyGqZxyhVTp8L0IlZYESX/gyhp5ArWJK0waP+JGLLNJHajfEWcsuVFOX9cUJo/HNnc/WVAkyjnpUyfnfNPw074c9NtoeTdWwj0j3HPyiwnGiI+x2TWccE6FTNEybsWtjHqptsB7A7anwJkRzl3Qhn6ODNO2QZEOf/WoDRFlHxACrARODLKeXmx9DHsWcQKM6PkfzQljVxx5HI/+gPATTHKwYoy9DGuZ0nkd0FlrEtaN81uQnX7W5yPmwjn5scqJ+kKar6SOXyB9ZDyPbaA5wL/ww6v/lVEBotIcfhJYcNH34XHix0GOxK4DVsg3by3AF9j3VQdI5Envrl5C/aLuBQiMh04ClvhrsS6adqBHR7vD/QUa+oSLe+dxJ4McrGznS7Wm0s8uHmvJvmzv1OZt5I8gt9tVYEDY4QQV6Bl6VQQbtncArwTp1xl6lRFEJH/Ae2wiyMtwk7m34bVxwtE5Mo4ZIv1nysi22VYc58Z2A/5bEfGu4B2Et2OOKU657zD2gHjse/catiRiVexow0vRjovgXKiWFJSx1UUsWZJJwI3YU1GBDs6Mgu4HOghkV3+Qup15k7sR+N72I+YHOxH9yPYBvm8MuQqq34tr1w/YtsVjzjy5FCyRsNpInJPpPMcM1d3DlsqnmUhcA5wBfb57cE+zx+wa1J0kihOLyi5Z/6ayPr5RaCh4gHogy10s1OQ901O3q+nIO8nnbzvT0HeHzh5X7035a0hM8LeqlMVlKuRI9dO4EC/5QmTLSN1LpXlREPm32dKPngDwFF+yxMmW8rq1wrK1dGRazURzG58ls31LHO2n3JoT/neTxdnOyJFeQswMkV57wJGJTNTx33iiVifpU/vLXkrGcXeqlMVwf3PT0jy/LdXmAzXuVSWE6WETL3P7bHre7wpIj/5LUwYKalfk4D7LO8R67c+IzDGHIidBDpXRHxdB0Ub5Xs/nYHvRWRKMjMNqgzfFjtUlcy8G2LdKI5NQQPgWJwJJ5KE1RrTmLeSOex1OpUEOmPtLzOtEs9knUtJOVFKkan3ubOzzagP7BTXrxWlM9YE7Sm/BQnDfZZ3+CoFYJxue0VRFEVRFEVRfEJ7yhVFURRFURTFZ7RRriiKoiiKoig+o41yRVEURVEURfEZbZQriqIoiqIois9oo1xRFEVRFEVRfEYb5YqiKIqiKIriM9ooVxRFURRFURSf0Ua5oiiKoiiKovhMtt8CpApjjK6KpChBiIjxW4ZoqL4qSiiZrK+gOqso4SRDZ7WnXFEURVEURVF8RhvliqIoiqIoiuIz2ihXFEVRFEVRFJ/RRrmSdvr378+yZctYtmwZIsKTTz5J5cqVqVy5st+iKYqiKIqi+II2yhVFURRFURTFZ4zIvjmBel+fGZ6Xl+dtu3TpEjEOYMSIEQDk5+enSbLIVK9eneeeew6As846iypVqoTEH3jggQBs2rQp7bLtDfTp0weAxx57jO+++47u3bsnnEcme3PY1/VVURIlk/UVVGcVJZxk6Ow+6xJxX2bGjBkhDe9Y3H777d5vPxrmJ510EgBvv/02devWTfv1XWbOnAnAzp07ufLKK/n11199k6U8DBo0CIB69eqxr35Il5dDDjnE+11UVARAcXExOTk5ACxdutQXuRRFKc2gQYMYN24cAFlZWQQCgVJpsrKymDdvHqNGjQLg+eefT6uMiuIXar6iKIqiKIqiKD6jPeVlkJ1tb9Gll17KmWeeCVjzi6ysLKZMmQLANddck5ae12CTlWBimaj41auanZ1Nhw4dvHtUu3ZtL+6zzz5j3bp1AFxwwQVMnz6dgoKClMqza9cuAM444wy+/vprevToAcDs2bNTet1kccwxx3i/P/zwQx8l8Z/c3FzAlqnHHnuMnj17Aras7969G7A95jVq1ADgxhtv5MEHH4zYI6coSvro0qULo0eP9uqlQCAQsY4KBAIcccQRjB07FoBbbrmFIUOGAPDpp5+yc+fO9AmtKGlEG+VlcOutt4ZsAcaNG0fTpk29Rvr48ePT0iifMWNGqWPGlDZhchvtwaYr6ebuu+/m+uuv9/ZFhPHjxwNw3XXX0bp1awB69OjBokWLKC4uTqk8V1xxBQDLly+nUaNGTJo0CbAfNJk+NDpo0CDq1avn7VevXt1Hafxn6tSpAJx88sml4goLCwFYvHgxxx13HAD33XcfIsIDDzyQFvk6duzI119/zbvvvgvYD9RIuhuLcePGsWXLllSIpyhp529/+xsA//rXv7yP6nhwPXK1atXK06dTTz2V5cuXs2LFiqTLqSi+IyL7ZACkoqFv375SXFwsxcXFUlRUJIMGDZJBgwZJlSpV5LjjjpOioiIpKiqSiRMnVvha8YRg8vPzJT8/P2K6GTNmyIwZM0qlT7V82dnZcs8998g999wjRUVFUlxcLLt375bdu3dLly5dIp7TqVMnycnJSblslStXlsqVK8v9998vO3bs8O7L7t27ZcqUKTJlyhQZOHCg1K9fX+rXr5+W51lWyMrKkqysLHnvvfckEAh4oUePHuUtP77rZTL01S37gUBAVq1aJU8//bQ8/fTTcthhh4Wka9GihbRo0UJWrVolgUBAbr75Zrn55ptT/txatWolv/zyi/fuKE+YMGGC7+VPg7/Bb51Mls4aY7w6ya0z3eDWrfEcD66LN23aJJ07d5bOnTv7/pw0aHBDMvRKbcoVRVEURVEUxWfUfCUGjRo18n6vXbuWjz76CIA//viD9evXe3GtW7emZs2aAGzbti29QoYR7pnF9TqSDs8rgwYNYvjw4d7+r7/+yt///ncAZs2aFfGcL774IuVyQYlZw7Bhw5gwYYLnsWPIkCGcddZZgJ0r4HrveO+997jsssvYuHFjWuSLxFFHHQUQ4v5w/vz5vPPOO36JlBG8//77gHWf+fPPP0e1sXeHty+88EKmTZvGsGHDAGuTP2fOnJTJt2zZMjp37uzZtANeGWvXrh21atUKSX/kkUcC0KJFC+9YIkP8ipLJdO7cOaKpGcCPP/7I6aefDoS6w+3cuTNDhgzx5v4oyn6D30Ngfg+tRQq5ubmSm5srq1evloKCAikoKJBDDz3Ui69Zs6bMnj3bG07btm2bNG7cWBo3bpzqoZFSBMfn5eWVis/Ly5O8vLyUynXiiSfKiSeeKJs3b/buyaxZs6RatWq+DyeVFSpXrixdu3aVrl27yqOPPiorV66UlStXSiAQkNdee81X2V555RV55ZVXQkxXKmKG5LdOpkpfywqHHHKIbNu2zSubgwYN8r3cuaFKlSoyceJEmThxohQXF8vatWtl7dq1ctJJJ/kumwZ/g986mSydbdCgQUQTlaKiInnooYeinpebmysdO3aUjh07yrJly0LMV3bt2iV333233H333b4/Jw0a3JAMvVLzFUVRFEVRFEXxG7+/tv3+io8UevXqJb169ZKioiJ5/PHH5fHHHw+JHzp0aMhElAsvvDAtX2GRJnAG94KHx82YMSPlMlWtWlVmz57tjRx89NFH8tFHH0nTpk19/2otT6hTp47UqVNHAoGArF692jc5srOz5b///a/897//lUAgIBs3bpSNGzdKs2bNyp2n3zqZKn0tK3Tv3j1kEmWHDh18L2eA5OTkyF133RUim9sz6LdsGvwPfutksnS2YcOGUXvKb7vttrjyeOihh0J6youKirxRJb+fkwYNbkiGXqlNeQR69+7t/XbdrwGccsopAAwcODAk/ZIlS9IiV9euXYFQu/FYrtbc9Klk0qRJng/tJUuWcMkllwCwevXqlF97X2b06NG0bdvW23f98tavX59Vq1b5JdZejTvfY/PmzT5LYjnmmGO46aabvP09e/Ywb948HyVSlORzxBFHRI1r0KABDRo0AEJtysN54403uOaaa0KO3XXXXckRUFEyCDVfURRFURRFURSf0Z7yMNq3b+8tCgR29TCAoUOHel/qzZs390U2lxEjRpRa1TM8Ph00bdqUv/zlL+5QJs899xwrV66MmLZSpUpez/3//d//0aFDh4jppk6dyp133glYLzfpZujQod5vdzVSP7joootC9rOy7Pdz9+7d+eGHH/wQaa9lzJgxGGMyrqf8jjvuAPAWzurevTvbt2/3UyRFSTqff/55xEXuAK699lquvvpqADZu3Oj1fv/00098+umn1KlTB4Cjjz7aewfqyrzKvow2ysM47bTTyMnJ8fa3bt0K4DU8XYwxTJ8+HYju7i9VzJw502t4R1q103WDmCoqVaoE2NXZ6tevz7PPPgvAf/7zHy9Nbm4uxx57LJ06dQLsyp0nnHBCmXkfc8wxnousfv36sWzZsmSLH5VOnTpx2223AdbUIV0fN8G4JlLBq3bu2rXL+6BZunRp2mXKJFq0aMGpp54KwJ///GdatGjBSSedBITq6AcffOC5HmzRokUp/fUT1z3pX//6VwBuuOEGoKQDQFH2NVwz0C5duoS4+wwEAp5uNmjQgNGjRwPw+++/s3HjRm9Fz+bNm3uNcRFh48aNMc1dFGVvRRvlYSxevNjrUQv2Mxxeqf/xxx/ce++9aZUtmC5dukSNcxvqqWqcuz7Z3aXr3eWPs7KyPN/a+fn5nHPOOSHnuT2C27dv55NPPgHgl19+oXXr1iH+aA8++GCgxLd4qnH9RD/zzDPesWeffZa1a9em5fouVapU8e6p2ysE0L9///2+Me6uGfDcc895H3oubi9csI66/vGDadKkCQDffvstL7/8MgBr1qxh+fLlzJ07F0hPL7pb1o0x7Ny5k4ULF6b8moriFyLi1QWXX345N9xwA3/6059inlO7du1S/vyDadiwIS+++CIAEydOTJ6wiuIzalOuKIqiKIqiKD6jPeVhvPnmm97v3r1706tXr4jpvvjii5ieT1JJfn5+TJtyNy4/Pz8lK3nefPPN3u/CwkJv1ctbbrml1PUWLFgAwPTp0z0b7eD7Vrdu3VIrVL700ksAUe3Tk027du0AuzLr8uXLAXj44YfTcu1gmjdvznnnneftu6MJ7733XtplyTR++uknwHqf2bNnDwCLFi2iWbNm1K9fP648tmzZAtj77Ho9qVKlCiLieQsK9hr0l7/8JWnyu3Tv3p3WrVsD1kTqyiuvZNq0aUm/jqJkImPHjuXjjz9m0aJFFc7r9ddfT4JEipJZaKM8Am7DfOXKlVEb5e5kRD8IN11xbZ/z8/NDhvBjmbiUl3bt2vHPf/7T2y8sLPRsyU888UTv+OLFi3n11Vd58MEHAWsj6FKjRg3OPfdcAG699VZat27tmSB888033gS4dNCuXTueeuopwNpuu+4w3SXa00WlSpU823ywQ77upCc/JrxmGq7bNBFh9uzZgLXBPvbYY+nevXvEc9wPLHci2eeffw5YF23ukvYNGzakffv2XmN8xYoVIcvdJ4uePXsCVkddm9offviBV155JenXUpRMZunSpWRnlzQ92rRpA8Bll13m1Vnt2rUrNaEzeKLnO++8w+OPP54miRUlfaj5iqIoiqIoiqL4jd+rgvm92lis8O9//1sCgYAEAoGQVffy8/N9WS0qPz9f8vPzJZy8vDxvZc9wki1Dx44dQ+5FeHj++efl+eefl8qVK4ec17JlS3nwwQflwQcflPnz54ecs2rVKunZs6f07NlT6tevn5Z76d6zpUuXSmFhoRQWFkqLFi18ea6AdOjQwStrgUBApkyZkvRr+K2TFdFXl+B75IbguMWLF8vixYulW7duvj3LSGHWrFkya9YsKS4ulp07d8rOnTvlmmuu8V0uDZkb/NbJdNSxwaF79+6yefNm2bx5c8jKnW6YMmWKTJkyRU444QTJzc31/flo0BAekqFXar4SgY4dOwIwfPhw9+WDiPD1118D+OJ1JS8vL6L7w65du6bcBWJZfPfdd4A1Rfnss88AaNasGYcddphnf96uXbsQN3/r168H4NFHH2XMmDEh5i2ppnnz5owZMwaAli1bMnbsWCD9JivBdO3aNcSX7z333OObLJnIn//8ZwCGDRvGoYceGhLn3rfXX3+dF154AYANGzakV8AIuHL16NGD9u3be8eHDx8O4JVBRdmfaNq0KdWqVfP2XTe03bp1o3bt2hHP2bhxYylvXoqyL6LmK4qiKIqiKIriM9pTHoFhw4YBhHzNAzzwwAOAnRCYbsJ7yd3e8ZkzZ3reVqKlSTVffvklYHud3Z7xk08+2VtkCOxIw5VXXgnAzz//7Hll8aNH88EHH+SII44AYNmyZZ4nDj9wF8K5++67ERHPM80333zjm0yZyLx58wAYMGCAv4IkgOvP/4033vCOzZs3j8mTJ/slkqKknC5dungTmyNxzjnneH7KjTHeaHQkXM9e3bp1S66QipKhaKM8jCZNmnDssceWOv7UU095q5L5QbgLRHc/0gst2BtLslmxYoXXoHZnzQ8ZMqRUuj179rBgwQLGjx8P2IbJqlWrki5Pohx11FGcffbZ3gJRAwYM8FZt9QO38jLGsH37di6++GIAioqKfJNJSR1PPfUU69at81sMRUkZM2fOLOU5JRpZWVkR02ZlZfHuu++qyYqy36GN8jAuuuiikNXGFi9eDOD18vpFcI94LEaMGJGSxrjLunXrPBd0t912G7179/Z6BOfMmeO5k3zvvfc839KZxHXXXUeVKlU8V3RuL79ftGzZErCN8j179vC///3PV3mU5HHjjTeWOha8DoKi7IsEAoGYvd/xpF2+fHnIehiKsr+gNuWKoiiKoiiK4jMm3i/avQ1jTMJ/rH79+sydO5emTZsCsHbtWk455RTA2kH7SV5eXsQVRGfOnMmnn34KpMZcZV+hVatWgF0lMycnh+OPPx7Ad5OaHj16ADB58mRmz56dklUkXUTElJ3KH8qjr5nOE088AdhFUVyaN28esmqookQjk/UVouvs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cuTImM2W6fTdd99h9+7d9rpVsX355ZfttvCAbk9rzdrp9Zf77Oxsn8q4JR7tyHfu3Ik5c+YAAG655Zag6YqKiuymNQsXLmSTlSi1bNkSANCkSRP89NNPnsZifVn++uuv7W3XX389Zs6ciWbNmgHQ7eGtL2hej/JEPw+slIfQrl07NGnSxF7/9NNPAVR27omn/fv320Md3nffffadGOcJo2PHjrj//vvxt7/9DQBw4MCBuMdJFGvr16+3p+Lu0qULXnzxRQC68nvs2DG7UluvXj37PatWrcKWLVviHisALF68GNdff739lO2CCy5At27dqn3fmjVr7DbSznIdS23btrWneu/UqZPdztxqA211bhs+fHjQfivxlJ2d7dOhftmyZXbnzngoKiqyK12NGzfGNddc47PfGjby+++/9xkikWo/6zxTUFCAX/3qVwCAe+65B02bNrWf1jn7gBDFAtuUExERERF5TEUyXFdtopSq8R82dOhQe7hEpZR9F2nw4ME1zbpG8vPz7REBZs+ebf982223YceOHbjkkksAVB2Ngo5vIlJ1GIkEUV15vffeewHAblIRTFlZGQA9cVawdtzxcsIJJwDQT7aSk5MB6OYqw4YNAwBs2rQJCxYswJo1awAA77//Po4ePRrzOKx26t9++23IdAsWLLAnvolkwiM35eXlVWlHHu/hD72SyOUViM01FgBGjx4NAHjyySfxxRdfAADOP/98V8pCKBkZGfZITqmpqQHTFBQUYN26dRg4cCAAuNLEjGqvWJRZVspD+PDDD+02l0ePHrV/ti6iXmncuLE9XvAtt9xit72bN28enn32WftRP5FTIl/kqyuv1tCkQ4cOxYwZMwKmWbVqld00w+sKeSJJT08HoPvC3HzzzT77nnzySQDABx98gE8++QTFxcVxjy8QqyJuNV2xKuLx6tyZCBK5vAKxq5Qnko4dOwIArrjiCnTq1AmA/oIwf/58ALqTtFfN4ijxxaLMsvkKEREREZHHeKc8hPPPP9+eJGjatGn2XTii2iiR77z9HO+6UfScd8qdnTuPl6YrQGKXV4Bllsgfm6+EwBMGka9EvsizvBL5SuTyCrDMEvlj8xUiIiIiop8BVsqJiIiIiDz2s22+QkRERERUW/BOORERERGRx1gpJyIiIiLyGCvlREREREQeY6WciIiIiMhjrJQTEREREXmMlXIiIiIiIo+xUk5ERERE5DFWyomIiIiIPMZKORERERGRx1gpJyIiIiLyGCvlREREREQeY6WciIiIiMhjrJQTEREREXmMlXIiIiIiIo+xUk5ERERE5DFWyomIiIiIPMZKORERERGRx1gpJyIiIiLyGCvlREREREQeY6WciIiIiMhjrJQTEREREXmMlXIiIiIiIo+xUk5ERERE5DFWyomIiIiIPMZKORERERGRx1gpJyIiIiLyGCvlREREREQeY6WciIiIiMhjrJQTEREREXmMlXIiIiIiIo+xUk5ERERE5DFWyomIiIiIPMZKORERERGRx1gpJyIiIiLyGCvlREREREQeY6WciIiIiMhjrJQTEREREXmMlXIiIiIiIo+xUk5ERERE5DFWyomIiIiIPMZKORERERGRx1gpJyIiIiLyGCvlREREREQeY6WciIiIiMhjrJQTEREREXmMlXIiIiIiIo/9P5gw31vuCzd3AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x270805c07f0>"
      ]
     },
     "metadata": {
      "image/png": {
       "height": 246,
       "width": 370
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 显示生成的图片\n",
    "for i in range(15):\n",
    "    plt.subplot(5, 3, i+1)\n",
    "    index = random.randint(0, n_test-1)\n",
    "    title = ''\n",
    "    for j in range(n_len):\n",
    "        title += str(np.argmax(y_test[j][index])) + ','\n",
    "    \n",
    "    plt.title(title)\n",
    "    plt.imshow(X_test[index][:,:,0], cmap='gray')\n",
    "    plt.axis('off')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 练习：设计并测试一个模型架构\n",
    "\n",
    "设计并实现一个能够识别数字序列的深度学习模型。为了产生用于测试的合成数字序列，你可以进行如下的设置：比如，你可以限制一个数据序列最多五个数字，并在你的深度网络上使用五个分类器。同时，你有必要准备一个额外的“空白”的字符，以处理相对较短的数字序列。\n",
    "\n",
    "在思考这个问题的时候有很多方面可以考虑：\n",
    "\n",
    "- 你的模型可以基于深度神经网络或者是卷积神经网络。\n",
    "- 你可以尝试是否在每个分类器间共享权值。\n",
    "- 你还可以在深度神经网络中使用循环网络来替换其中的分类层，并且将数字序列里的数字一个一个地输出。\n",
    "\n",
    "在使用 Keras 搭建模型的时候，你可以使用 [函数式模型 API](http://keras-cn.readthedocs.io/en/latest/models/model/) 的方式来搭建多输出模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "from keras.models import Model\n",
    "from keras.layers import *\n",
    "import tensorflow as tf\n",
    "\n",
    "# This returns a tensor\n",
    "inputs = Input(shape=(28, 140, 1))\n",
    "\n",
    "conv_11 = Conv2D(filters= 32, kernel_size=(5,5), padding='Same', activation='relu')(inputs)\n",
    "max_pool_11 = MaxPool2D(pool_size=(2,2))(conv_11)\n",
    "conv_12 = Conv2D(filters= 10, kernel_size=(3,3), padding='Same', activation='relu')(max_pool_11)\n",
    "max_pool_12 = MaxPool2D(pool_size=(2,2), strides=(2,2))(conv_12)\n",
    "flatten11 = Flatten()(max_pool_12)\n",
    "hidden11 = Dense(15, activation='relu')(flatten11)\n",
    "prediction1 = Dense(11, activation='softmax')(hidden11)\n",
    "\n",
    "# conv_21 = Conv2D(filters= 32, kernel_size=(5,5), padding='Same', activation='relu')(inputs)\n",
    "# max_pool_21 = MaxPool2D(pool_size=(2,2))(conv_21)\n",
    "# conv_22 = Conv2D(filters= 10, kernel_size=(3,3), padding='Same', activation='relu')(max_pool_21)\n",
    "# max_pool_22 = MaxPool2D(pool_size=(2,2), strides=(2,2))(conv_22)\n",
    "# flatten21 = Flatten()(max_pool_22)\n",
    "hidden21 = Dense(15, activation='relu')(flatten11)\n",
    "prediction2 = Dense(11, activation='softmax')(hidden21)\n",
    "\n",
    "# conv_31 = Conv2D(filters= 32, kernel_size=(5,5), padding='Same', activation='relu')(inputs)\n",
    "# max_pool_31 = MaxPool2D(pool_size=(2,2))(conv_31)\n",
    "# conv_32 = Conv2D(filters= 10, kernel_size=(3,3), padding='Same', activation='relu')(max_pool_31)\n",
    "# max_pool_32 = MaxPool2D(pool_size=(2,2), strides=(2,2))(conv_32)\n",
    "# flatten31 = Flatten()(max_pool_32)\n",
    "hidden31 = Dense(15, activation='relu')(flatten11)\n",
    "prediction3 = Dense(11, activation='softmax')(hidden31)\n",
    "\n",
    "# conv_41 = Conv2D(filters= 32, kernel_size=(5,5), padding='Same', activation='relu')(inputs)\n",
    "# max_pool_41 = MaxPool2D(pool_size=(2,2))(conv_41)\n",
    "# conv_42 = Conv2D(filters= 10, kernel_size=(3,3), padding='Same', activation='relu')(max_pool_41)\n",
    "# max_pool_42 = MaxPool2D(pool_size=(2,2), strides=(2,2))(conv_42)\n",
    "# flatten41 = Flatten()(max_pool_42)\n",
    "hidden41 = Dense(15, activation='relu')(flatten11)\n",
    "prediction4 = Dense(11, activation='softmax')(hidden41)\n",
    "\n",
    "# conv_51 = Conv2D(filters= 32, kernel_size=(5,5), padding='Same', activation='relu')(inputs)\n",
    "# max_pool_51 = MaxPool2D(pool_size=(2,2))(conv_51)\n",
    "# conv_52 = Conv2D(filters= 10, kernel_size=(3,3), padding='Same', activation='relu')(max_pool_51)\n",
    "# max_pool_52 = MaxPool2D(pool_size=(2,2), strides=(2,2))(conv_52)\n",
    "# flatten51 = Flatten()(max_pool_52)\n",
    "hidden51 = Dense(15, activation='relu')(flatten11)\n",
    "prediction5 = Dense(11, activation='softmax')(hidden51)\n",
    "\n",
    "model = Model(inputs=inputs, outputs=[prediction1,prediction2,prediction3,prediction4,prediction5])\n",
    "# model = Model(inputs=inputs, outputs=prediction1)\n",
    "\n",
    "model.compile(optimizer='rmsprop',\n",
    "              loss='categorical_crossentropy',\n",
    "              metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 问题 2\n",
    "_你为解决这个问题采取了什么技术？请详细介绍你使用的技术。_\n",
    "\n",
    "**回答：使用了卷积神经网络。卷积神经网络虽然运行慢，但是在识别图像中表现很好，因为它可以用到相邻像素间的信息，这是深度学习网络忽略掉的信息。卷积神经网络的原理是通过卷积核在图片上做卷积，学习得到特征，最底层是简单的线条，之后图形逐层复杂，多个卷积核在图片上做卷积，可以增加输出节点的深度，越深，携带的信息越多，当然，也要根据不同的情况进行调参，比如调整学习率、卷积核、stride、激活函数、损失函数、迭代次数、是否dropout等等。** \n",
    "\n",
    "**补充：**\n",
    "\n",
    "**Softmax：对于多分类问题，softmax函数可以得到各个分类的概率值。**\n",
    "\n",
    "**Activation function：激活函数是为了给网络加入非线性因素，如果没有激活函数，网络就是一个线性分类器，y=wx+b，如果这个y值通过了激活函数，结果就不是线性的了。这里用了relu激活函数， f(x)=max(0,x)，优点是得到的SGD的收敛速度会比 sigmoid快很多，相比于 sigmoid/tanh需要计算指数等，计算复杂度高，ReLU 只需要一个阈值就可以得到激活值，缺点是ReLU在训练的时候很”脆弱”，一不小心有可能导致神经元”坏死”，优缺点摘自[几种常见的激活函数](http://blog.csdn.net/u014365862/article/details/52710698)**\n",
    "\n",
    "**dropout：为了避免大型深度网络过拟合，会在训练时使用dropout来丢掉一些神经元，这样做可以提高模型的表现。**\n",
    "\n",
    "**rmsprop：一种寻找损失函数最小值的优化方法。[优化方法总结](http://blog.csdn.net/u010089444/article/details/76725843)中提到RMSprop是Geoff Hinton提出的一种自适应学习率方法。Adagrad会累加之前所有的梯度平方，而RMSprop仅仅是计算对应的平均值，因此可缓解Adagrad算法学习率下降较快的问题。 **\n",
    "\n",
    "**categorical_crossentropy：一种损失函数，也成多类对数损失，使用该目标函数时，需要将标签转化为形如(nb_samples, nb_classes)的二值序列，摘自[keras学习笔记03——常见重要模块](http://blog.csdn.net/xiaozhuge080/article/details/52688613)**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 可视化你的网络模型\n",
    "\n",
    "参考链接：[可视化visualization](http://keras-cn.readthedocs.io/en/latest/other/visualization/)\n",
    "\n",
    "可以是保存成 PNG 格式显示，也可以直接使用 SVG 格式。 SVG 是矢量图，它的优点是可以无限放大。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg height=\"556pt\" viewBox=\"0.00 0.00 607.50 556.00\" width=\"608pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g class=\"graph\" id=\"graph0\" transform=\"scale(1 1) rotate(0) translate(4 552)\">\n",
       "<title>G</title>\n",
       "<polygon fill=\"white\" points=\"-4,4 -4,-552 603.5,-552 603.5,4 -4,4\" stroke=\"none\"/>\n",
       "<!-- 2682214071712 -->\n",
       "<g class=\"node\" id=\"node1\"><title>2682214071712</title>\n",
       "<polygon fill=\"none\" points=\"233,-511.5 233,-547.5 359,-547.5 359,-511.5 233,-511.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times New Roman,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"296\" y=\"-525.8\">input_1: InputLayer</text>\n",
       "</g>\n",
       "<!-- 2682214071824 -->\n",
       "<g class=\"node\" id=\"node2\"><title>2682214071824</title>\n",
       "<polygon fill=\"none\" points=\"232.5,-438.5 232.5,-474.5 359.5,-474.5 359.5,-438.5 232.5,-438.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times New Roman,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"296\" y=\"-452.8\">conv2d_1: Conv2D</text>\n",
       "</g>\n",
       "<!-- 2682214071712&#45;&gt;2682214071824 -->\n",
       "<g class=\"edge\" id=\"edge1\"><title>2682214071712-&gt;2682214071824</title>\n",
       "<path d=\"M296,-511.313C296,-503.289 296,-493.547 296,-484.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"299.5,-484.529 296,-474.529 292.5,-484.529 299.5,-484.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 2682214068296 -->\n",
       "<g class=\"node\" id=\"node3\"><title>2682214068296</title>\n",
       "<polygon fill=\"none\" points=\"191.5,-365.5 191.5,-401.5 400.5,-401.5 400.5,-365.5 191.5,-365.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times New Roman,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"296\" y=\"-379.8\">max_pooling2d_1: MaxPooling2D</text>\n",
       "</g>\n",
       "<!-- 2682214071824&#45;&gt;2682214068296 -->\n",
       "<g class=\"edge\" id=\"edge2\"><title>2682214071824-&gt;2682214068296</title>\n",
       "<path d=\"M296,-438.313C296,-430.289 296,-420.547 296,-411.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"299.5,-411.529 296,-401.529 292.5,-411.529 299.5,-411.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 2682214070088 -->\n",
       "<g class=\"node\" id=\"node4\"><title>2682214070088</title>\n",
       "<polygon fill=\"none\" points=\"232.5,-292.5 232.5,-328.5 359.5,-328.5 359.5,-292.5 232.5,-292.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times New Roman,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"296\" y=\"-306.8\">conv2d_2: Conv2D</text>\n",
       "</g>\n",
       "<!-- 2682214068296&#45;&gt;2682214070088 -->\n",
       "<g class=\"edge\" id=\"edge3\"><title>2682214068296-&gt;2682214070088</title>\n",
       "<path d=\"M296,-365.313C296,-357.289 296,-347.547 296,-338.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"299.5,-338.529 296,-328.529 292.5,-338.529 299.5,-338.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 2682999429832 -->\n",
       "<g class=\"node\" id=\"node5\"><title>2682999429832</title>\n",
       "<polygon fill=\"none\" points=\"191.5,-219.5 191.5,-255.5 400.5,-255.5 400.5,-219.5 191.5,-219.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times New Roman,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"296\" y=\"-233.8\">max_pooling2d_2: MaxPooling2D</text>\n",
       "</g>\n",
       "<!-- 2682214070088&#45;&gt;2682999429832 -->\n",
       "<g class=\"edge\" id=\"edge4\"><title>2682214070088-&gt;2682999429832</title>\n",
       "<path d=\"M296,-292.313C296,-284.289 296,-274.547 296,-265.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"299.5,-265.529 296,-255.529 292.5,-265.529 299.5,-265.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 2682213841776 -->\n",
       "<g class=\"node\" id=\"node6\"><title>2682213841776</title>\n",
       "<polygon fill=\"none\" points=\"241.5,-146.5 241.5,-182.5 350.5,-182.5 350.5,-146.5 241.5,-146.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times New Roman,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"296\" y=\"-160.8\">flatten_1: Flatten</text>\n",
       "</g>\n",
       "<!-- 2682999429832&#45;&gt;2682213841776 -->\n",
       "<g class=\"edge\" id=\"edge5\"><title>2682999429832-&gt;2682213841776</title>\n",
       "<path d=\"M296,-219.313C296,-211.289 296,-201.547 296,-192.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"299.5,-192.529 296,-182.529 292.5,-192.529 299.5,-192.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 2682213451648 -->\n",
       "<g class=\"node\" id=\"node7\"><title>2682213451648</title>\n",
       "<polygon fill=\"none\" points=\"0,-73.5 0,-109.5 104,-109.5 104,-73.5 0,-73.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times New Roman,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"52\" y=\"-87.8\">dense_1: Dense</text>\n",
       "</g>\n",
       "<!-- 2682213841776&#45;&gt;2682213451648 -->\n",
       "<g class=\"edge\" id=\"edge6\"><title>2682213841776-&gt;2682213451648</title>\n",
       "<path d=\"M241.242,-147.566C203.419,-136.56 153.057,-121.906 113.796,-110.482\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"114.648,-107.084 104.068,-107.651 112.692,-113.806 114.648,-107.084\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 2682999817608 -->\n",
       "<g class=\"node\" id=\"node8\"><title>2682999817608</title>\n",
       "<polygon fill=\"none\" points=\"122,-73.5 122,-109.5 226,-109.5 226,-73.5 122,-73.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times New Roman,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"174\" y=\"-87.8\">dense_3: Dense</text>\n",
       "</g>\n",
       "<!-- 2682213841776&#45;&gt;2682999817608 -->\n",
       "<g class=\"edge\" id=\"edge7\"><title>2682213841776-&gt;2682999817608</title>\n",
       "<path d=\"M266.778,-146.494C250.45,-136.991 229.907,-125.036 212.305,-114.792\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"213.81,-111.618 203.406,-109.614 210.289,-117.669 213.81,-111.618\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 2682496998144 -->\n",
       "<g class=\"node\" id=\"node9\"><title>2682496998144</title>\n",
       "<polygon fill=\"none\" points=\"244,-73.5 244,-109.5 348,-109.5 348,-73.5 244,-73.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times New Roman,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"296\" y=\"-87.8\">dense_5: Dense</text>\n",
       "</g>\n",
       "<!-- 2682213841776&#45;&gt;2682496998144 -->\n",
       "<g class=\"edge\" id=\"edge8\"><title>2682213841776-&gt;2682496998144</title>\n",
       "<path d=\"M296,-146.313C296,-138.289 296,-128.547 296,-119.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"299.5,-119.529 296,-109.529 292.5,-119.529 299.5,-119.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 2682496907584 -->\n",
       "<g class=\"node\" id=\"node10\"><title>2682496907584</title>\n",
       "<polygon fill=\"none\" points=\"366,-73.5 366,-109.5 470,-109.5 470,-73.5 366,-73.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times New Roman,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"418\" y=\"-87.8\">dense_7: Dense</text>\n",
       "</g>\n",
       "<!-- 2682213841776&#45;&gt;2682496907584 -->\n",
       "<g class=\"edge\" id=\"edge9\"><title>2682213841776-&gt;2682496907584</title>\n",
       "<path d=\"M325.222,-146.494C341.55,-136.991 362.093,-125.036 379.695,-114.792\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"381.711,-117.669 388.594,-109.614 378.19,-111.618 381.711,-117.669\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 2683000560216 -->\n",
       "<g class=\"node\" id=\"node11\"><title>2683000560216</title>\n",
       "<polygon fill=\"none\" points=\"490,-73.5 490,-109.5 594,-109.5 594,-73.5 490,-73.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times New Roman,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"542\" y=\"-87.8\">dense_9: Dense</text>\n",
       "</g>\n",
       "<!-- 2682213841776&#45;&gt;2683000560216 -->\n",
       "<g class=\"edge\" id=\"edge10\"><title>2682213841776-&gt;2683000560216</title>\n",
       "<path d=\"M350.595,-147.743C388.91,-136.684 440.21,-121.878 480.056,-110.378\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"481.028,-113.741 489.665,-107.605 479.087,-107.015 481.028,-113.741\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 2682213464776 -->\n",
       "<g class=\"node\" id=\"node12\"><title>2682213464776</title>\n",
       "<polygon fill=\"none\" points=\"0,-0.5 0,-36.5 104,-36.5 104,-0.5 0,-0.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times New Roman,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"52\" y=\"-14.8\">dense_2: Dense</text>\n",
       "</g>\n",
       "<!-- 2682213451648&#45;&gt;2682213464776 -->\n",
       "<g class=\"edge\" id=\"edge11\"><title>2682213451648-&gt;2682213464776</title>\n",
       "<path d=\"M52,-73.3129C52,-65.2895 52,-55.5475 52,-46.5691\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"55.5001,-46.5288 52,-36.5288 48.5001,-46.5289 55.5001,-46.5288\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 2682246341632 -->\n",
       "<g class=\"node\" id=\"node13\"><title>2682246341632</title>\n",
       "<polygon fill=\"none\" points=\"122,-0.5 122,-36.5 226,-36.5 226,-0.5 122,-0.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times New Roman,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"174\" y=\"-14.8\">dense_4: Dense</text>\n",
       "</g>\n",
       "<!-- 2682999817608&#45;&gt;2682246341632 -->\n",
       "<g class=\"edge\" id=\"edge12\"><title>2682999817608-&gt;2682246341632</title>\n",
       "<path d=\"M174,-73.3129C174,-65.2895 174,-55.5475 174,-46.5691\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"177.5,-46.5288 174,-36.5288 170.5,-46.5289 177.5,-46.5288\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 2682999952944 -->\n",
       "<g class=\"node\" id=\"node14\"><title>2682999952944</title>\n",
       "<polygon fill=\"none\" points=\"244,-0.5 244,-36.5 348,-36.5 348,-0.5 244,-0.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times New Roman,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"296\" y=\"-14.8\">dense_6: Dense</text>\n",
       "</g>\n",
       "<!-- 2682496998144&#45;&gt;2682999952944 -->\n",
       "<g class=\"edge\" id=\"edge13\"><title>2682496998144-&gt;2682999952944</title>\n",
       "<path d=\"M296,-73.3129C296,-65.2895 296,-55.5475 296,-46.5691\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"299.5,-46.5288 296,-36.5288 292.5,-46.5289 299.5,-46.5288\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 2682497071816 -->\n",
       "<g class=\"node\" id=\"node15\"><title>2682497071816</title>\n",
       "<polygon fill=\"none\" points=\"366,-0.5 366,-36.5 470,-36.5 470,-0.5 366,-0.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times New Roman,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"418\" y=\"-14.8\">dense_8: Dense</text>\n",
       "</g>\n",
       "<!-- 2682496907584&#45;&gt;2682497071816 -->\n",
       "<g class=\"edge\" id=\"edge14\"><title>2682496907584-&gt;2682497071816</title>\n",
       "<path d=\"M418,-73.3129C418,-65.2895 418,-55.5475 418,-46.5691\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"421.5,-46.5288 418,-36.5288 414.5,-46.5289 421.5,-46.5288\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 2683000585744 -->\n",
       "<g class=\"node\" id=\"node16\"><title>2683000585744</title>\n",
       "<polygon fill=\"none\" points=\"488.5,-0.5 488.5,-36.5 599.5,-36.5 599.5,-0.5 488.5,-0.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times New Roman,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"544\" y=\"-14.8\">dense_10: Dense</text>\n",
       "</g>\n",
       "<!-- 2683000560216&#45;&gt;2683000585744 -->\n",
       "<g class=\"edge\" id=\"edge15\"><title>2683000560216-&gt;2683000585744</title>\n",
       "<path d=\"M542.484,-73.3129C542.71,-65.2895 542.985,-55.5475 543.237,-46.5691\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"546.737,-46.6235 543.52,-36.5288 539.74,-46.4263 546.737,-46.6235\" stroke=\"black\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.SVG object>"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from keras.utils.vis_utils import plot_model, model_to_dot\n",
    "from IPython.display import Image, SVG\n",
    "\n",
    "# TODO: 可视化你的模型\n",
    "\n",
    "SVG(model_to_dot(model).create(prog='dot', format='svg'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 问题 3\n",
    "_你最终的模型架构是什么样的？（什么类型的模型，层数，大小, 如何连接等）_\n",
    "\n",
    "**回答：使用了卷积神经网络的经典模型，一共6层，卷积层（卷积核5*5，激活函数relu，padding是Same，32个卷积核）->最大池化层（2*2）->卷积层（3*3，relu，Same，10）->最大池化层（2*2，strde2*2）->flatten->hidden（15）），本来应该还有一个隐藏层，但是发现没有表现也很好，为了运行速度，所以就去掉了。五个分类器从过了卷积层开始，因为经过无数次试验，不用从一开始input就分成5个，可以用卷积层学到特征，然后最后深度学习网络分成五个去识别。**\n",
    "\n",
    "- ** 这里是疑问：**\n",
    "开始受笔记本电脑性能限制，没用gpu，训练上述一模一样的网络，每个分类器的accuracy是0.1，所以我又不断调整参数以及网络结构，正确率都是0.1左右，而我换成gpu，为什么performance会好？还有依然是cpu上试验，我换成上述代码中取消注释后的网络结构，即从inputs就开始分成5个分类器的网络后，只有1个accuracy是0.9+，其他都是0.1以下，这是为什么？感觉就像一样的老师一样的东西，只有一个学生聪明，其他都是傻子。然后我又换成只有1个分类器，识别第一位，accuracy是0.9+，识别其他位正确率也很高，只要是单独识别一位就好，这是为什么？难道5个独立的分类器一起训练会互相干扰？所有cpu失败的网络在gpu上一跑，performance都特别好，感觉花了好几天时间调调网络结构，不如换一块gpu……"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 练习：训练你的网络模型\n",
    "\n",
    "训练你的模型时，需要设置训练集和验证集。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 48000 samples, validate on 12000 samples\n",
      "Epoch 1/20\n",
      "48000/48000 [==============================] - 75s 2ms/step - loss: 3.0085 - dense_2_loss: 0.7074 - dense_4_loss: 0.6174 - dense_6_loss: 0.6227 - dense_8_loss: 0.6636 - dense_10_loss: 0.3974 - dense_2_acc: 0.7811 - dense_4_acc: 0.8122 - dense_6_acc: 0.7990 - dense_8_acc: 0.7944 - dense_10_acc: 0.8780 - val_loss: 0.8781 - val_dense_2_loss: 0.1946 - val_dense_4_loss: 0.1816 - val_dense_6_loss: 0.1658 - val_dense_8_loss: 0.2342 - val_dense_10_loss: 0.1019 - val_dense_2_acc: 0.9438 - val_dense_4_acc: 0.9487 - val_dense_6_acc: 0.9503 - val_dense_8_acc: 0.9243 - val_dense_10_acc: 0.9692\n",
      "Epoch 2/20\n",
      "48000/48000 [==============================] - 64s 1ms/step - loss: 0.4907 - dense_2_loss: 0.1198 - dense_4_loss: 0.1002 - dense_6_loss: 0.0932 - dense_8_loss: 0.1189 - dense_10_loss: 0.0585 - dense_2_acc: 0.9636 - dense_4_acc: 0.9701 - dense_6_acc: 0.9725 - dense_8_acc: 0.9639 - dense_10_acc: 0.9832 - val_loss: 0.4343 - val_dense_2_loss: 0.1271 - val_dense_4_loss: 0.1013 - val_dense_6_loss: 0.0892 - val_dense_8_loss: 0.0702 - val_dense_10_loss: 0.0464 - val_dense_2_acc: 0.9644 - val_dense_4_acc: 0.9713 - val_dense_6_acc: 0.9766 - val_dense_8_acc: 0.9807 - val_dense_10_acc: 0.9874\n",
      "Epoch 3/20\n",
      "48000/48000 [==============================] - 64s 1ms/step - loss: 0.2480 - dense_2_loss: 0.0680 - dense_4_loss: 0.0568 - dense_6_loss: 0.0454 - dense_8_loss: 0.0528 - dense_10_loss: 0.0250 - dense_2_acc: 0.9792 - dense_4_acc: 0.9830 - dense_6_acc: 0.9865 - dense_8_acc: 0.9851 - dense_10_acc: 0.9930 - val_loss: 0.4070 - val_dense_2_loss: 0.1354 - val_dense_4_loss: 0.0868 - val_dense_6_loss: 0.0823 - val_dense_8_loss: 0.0596 - val_dense_10_loss: 0.0429 - val_dense_2_acc: 0.9644 - val_dense_4_acc: 0.9743 - val_dense_6_acc: 0.9788 - val_dense_8_acc: 0.9829 - val_dense_10_acc: 0.9886\n",
      "Epoch 4/20\n",
      "48000/48000 [==============================] - 64s 1ms/step - loss: 0.1576 - dense_2_loss: 0.0455 - dense_4_loss: 0.0365 - dense_6_loss: 0.0298 - dense_8_loss: 0.0339 - dense_10_loss: 0.0120 - dense_2_acc: 0.9859 - dense_4_acc: 0.9885 - dense_6_acc: 0.9909 - dense_8_acc: 0.9897 - dense_10_acc: 0.9963 - val_loss: 0.3907 - val_dense_2_loss: 0.1097 - val_dense_4_loss: 0.0927 - val_dense_6_loss: 0.0838 - val_dense_8_loss: 0.0543 - val_dense_10_loss: 0.0503 - val_dense_2_acc: 0.9711 - val_dense_4_acc: 0.9738 - val_dense_6_acc: 0.9786 - val_dense_8_acc: 0.9837 - val_dense_10_acc: 0.9889\n",
      "Epoch 5/20\n",
      "48000/48000 [==============================] - 64s 1ms/step - loss: 0.1105 - dense_2_loss: 0.0333 - dense_4_loss: 0.0260 - dense_6_loss: 0.0200 - dense_8_loss: 0.0229 - dense_10_loss: 0.0084 - dense_2_acc: 0.9892 - dense_4_acc: 0.9917 - dense_6_acc: 0.9936 - dense_8_acc: 0.9934 - dense_10_acc: 0.9972 - val_loss: 0.4259 - val_dense_2_loss: 0.1250 - val_dense_4_loss: 0.1091 - val_dense_6_loss: 0.0822 - val_dense_8_loss: 0.0634 - val_dense_10_loss: 0.0463 - val_dense_2_acc: 0.9722 - val_dense_4_acc: 0.9748 - val_dense_6_acc: 0.9819 - val_dense_8_acc: 0.9839 - val_dense_10_acc: 0.9916\n",
      "Epoch 6/20\n",
      "48000/48000 [==============================] - 64s 1ms/step - loss: 0.0856 - dense_2_loss: 0.0270 - dense_4_loss: 0.0190 - dense_6_loss: 0.0158 - dense_8_loss: 0.0184 - dense_10_loss: 0.0053 - dense_2_acc: 0.9916 - dense_4_acc: 0.9937 - dense_6_acc: 0.9951 - dense_8_acc: 0.9944 - dense_10_acc: 0.9984 - val_loss: 0.4738 - val_dense_2_loss: 0.1332 - val_dense_4_loss: 0.1225 - val_dense_6_loss: 0.0974 - val_dense_8_loss: 0.0643 - val_dense_10_loss: 0.0563 - val_dense_2_acc: 0.9743 - val_dense_4_acc: 0.9766 - val_dense_6_acc: 0.9825 - val_dense_8_acc: 0.9852 - val_dense_10_acc: 0.9901\n",
      "Epoch 7/20\n",
      "48000/48000 [==============================] - 64s 1ms/step - loss: 0.0684 - dense_2_loss: 0.0224 - dense_4_loss: 0.0170 - dense_6_loss: 0.0121 - dense_8_loss: 0.0136 - dense_10_loss: 0.0033 - dense_2_acc: 0.9930 - dense_4_acc: 0.9948 - dense_6_acc: 0.9959 - dense_8_acc: 0.9958 - dense_10_acc: 0.9989 - val_loss: 0.4288 - val_dense_2_loss: 0.1542 - val_dense_4_loss: 0.1013 - val_dense_6_loss: 0.0807 - val_dense_8_loss: 0.0526 - val_dense_10_loss: 0.0399 - val_dense_2_acc: 0.9707 - val_dense_4_acc: 0.9796 - val_dense_6_acc: 0.9857 - val_dense_8_acc: 0.9873 - val_dense_10_acc: 0.9927\n",
      "Epoch 8/20\n",
      "48000/48000 [==============================] - 64s 1ms/step - loss: 0.0563 - dense_2_loss: 0.0201 - dense_4_loss: 0.0131 - dense_6_loss: 0.0091 - dense_8_loss: 0.0112 - dense_10_loss: 0.0028 - dense_2_acc: 0.9936 - dense_4_acc: 0.9960 - dense_6_acc: 0.9973 - dense_8_acc: 0.9967 - dense_10_acc: 0.9991 - val_loss: 0.5419 - val_dense_2_loss: 0.1704 - val_dense_4_loss: 0.1336 - val_dense_6_loss: 0.1071 - val_dense_8_loss: 0.0833 - val_dense_10_loss: 0.0476 - val_dense_2_acc: 0.9717 - val_dense_4_acc: 0.9782 - val_dense_6_acc: 0.9830 - val_dense_8_acc: 0.9861 - val_dense_10_acc: 0.9927\n",
      "Epoch 9/20\n",
      "47872/48000 [============================>.] - ETA: 0s - loss: 0.0496 - dense_2_loss: 0.0161 - dense_4_loss: 0.0129 - dense_6_loss: 0.0074 - dense_8_loss: 0.0113 - dense_10_loss: 0.0020 - dense_2_acc: 0.9952 - dense_4_acc: 0.9964 - dense_6_acc: 0.9977 - dense_8_acc: 0.9969 - dense_10_acc: 0.9994\n",
      "Epoch 00009: ReduceLROnPlateau reducing learning rate to 0.000800000037997961.\n",
      "48000/48000 [==============================] - 64s 1ms/step - loss: 0.0496 - dense_2_loss: 0.0161 - dense_4_loss: 0.0128 - dense_6_loss: 0.0074 - dense_8_loss: 0.0113 - dense_10_loss: 0.0020 - dense_2_acc: 0.9952 - dense_4_acc: 0.9964 - dense_6_acc: 0.9977 - dense_8_acc: 0.9969 - dense_10_acc: 0.9994 - val_loss: 0.5190 - val_dense_2_loss: 0.1596 - val_dense_4_loss: 0.1344 - val_dense_6_loss: 0.1072 - val_dense_8_loss: 0.0674 - val_dense_10_loss: 0.0504 - val_dense_2_acc: 0.9743 - val_dense_4_acc: 0.9791 - val_dense_6_acc: 0.9838 - val_dense_8_acc: 0.9878 - val_dense_10_acc: 0.9930\n",
      "Epoch 10/20\n",
      "48000/48000 [==============================] - 64s 1ms/step - loss: 0.0353 - dense_2_loss: 0.0122 - dense_4_loss: 0.0094 - dense_6_loss: 0.0060 - dense_8_loss: 0.0064 - dense_10_loss: 0.0014 - dense_2_acc: 0.9967 - dense_4_acc: 0.9974 - dense_6_acc: 0.9982 - dense_8_acc: 0.9982 - dense_10_acc: 0.9995 - val_loss: 0.5077 - val_dense_2_loss: 0.1546 - val_dense_4_loss: 0.1347 - val_dense_6_loss: 0.0925 - val_dense_8_loss: 0.0658 - val_dense_10_loss: 0.0602 - val_dense_2_acc: 0.9758 - val_dense_4_acc: 0.9811 - val_dense_6_acc: 0.9859 - val_dense_8_acc: 0.9890 - val_dense_10_acc: 0.9927\n",
      "Epoch 11/20\n",
      "48000/48000 [==============================] - 64s 1ms/step - loss: 0.0251 - dense_2_loss: 0.0085 - dense_4_loss: 0.0064 - dense_6_loss: 0.0043 - dense_8_loss: 0.0050 - dense_10_loss: 8.1526e-04 - dense_2_acc: 0.9973 - dense_4_acc: 0.9982 - dense_6_acc: 0.9987 - dense_8_acc: 0.9986 - dense_10_acc: 0.9997 - val_loss: 0.6006 - val_dense_2_loss: 0.1840 - val_dense_4_loss: 0.1577 - val_dense_6_loss: 0.1180 - val_dense_8_loss: 0.0720 - val_dense_10_loss: 0.0688 - val_dense_2_acc: 0.9731 - val_dense_4_acc: 0.9809 - val_dense_6_acc: 0.9849 - val_dense_8_acc: 0.9889 - val_dense_10_acc: 0.9925\n",
      "Epoch 12/20\n",
      "48000/48000 [==============================] - 64s 1ms/step - loss: 0.0237 - dense_2_loss: 0.0088 - dense_4_loss: 0.0067 - dense_6_loss: 0.0039 - dense_8_loss: 0.0039 - dense_10_loss: 4.2886e-04 - dense_2_acc: 0.9977 - dense_4_acc: 0.9983 - dense_6_acc: 0.9988 - dense_8_acc: 0.9991 - dense_10_acc: 0.9999 - val_loss: 0.5824 - val_dense_2_loss: 0.1836 - val_dense_4_loss: 0.1394 - val_dense_6_loss: 0.1149 - val_dense_8_loss: 0.0852 - val_dense_10_loss: 0.0592 - val_dense_2_acc: 0.9753 - val_dense_4_acc: 0.9823 - val_dense_6_acc: 0.9852 - val_dense_8_acc: 0.9884 - val_dense_10_acc: 0.9936\n",
      "Epoch 13/20\n",
      "47872/48000 [============================>.] - ETA: 0s - loss: 0.0244 - dense_2_loss: 0.0088 - dense_4_loss: 0.0070 - dense_6_loss: 0.0035 - dense_8_loss: 0.0042 - dense_10_loss: 9.1209e-04 - dense_2_acc: 0.9977 - dense_4_acc: 0.9980 - dense_6_acc: 0.9990 - dense_8_acc: 0.9987 - dense_10_acc: 0.9998\n",
      "Epoch 00013: ReduceLROnPlateau reducing learning rate to 0.0006400000303983689.\n",
      "\n",
      "Epoch 00013: ReduceLROnPlateau reducing learning rate to 0.0005120000336319208.\n",
      "48000/48000 [==============================] - 64s 1ms/step - loss: 0.0244 - dense_2_loss: 0.0088 - dense_4_loss: 0.0070 - dense_6_loss: 0.0035 - dense_8_loss: 0.0042 - dense_10_loss: 9.0965e-04 - dense_2_acc: 0.9977 - dense_4_acc: 0.9980 - dense_6_acc: 0.9990 - dense_8_acc: 0.9987 - dense_10_acc: 0.9998 - val_loss: 0.6273 - val_dense_2_loss: 0.1873 - val_dense_4_loss: 0.1665 - val_dense_6_loss: 0.1196 - val_dense_8_loss: 0.0774 - val_dense_10_loss: 0.0765 - val_dense_2_acc: 0.9761 - val_dense_4_acc: 0.9793 - val_dense_6_acc: 0.9852 - val_dense_8_acc: 0.9888 - val_dense_10_acc: 0.9922\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 14/20\n",
      "48000/48000 [==============================] - 64s 1ms/step - loss: 0.0094 - dense_2_loss: 0.0035 - dense_4_loss: 0.0027 - dense_6_loss: 0.0010 - dense_8_loss: 0.0020 - dense_10_loss: 1.7758e-04 - dense_2_acc: 0.9991 - dense_4_acc: 0.9995 - dense_6_acc: 0.9998 - dense_8_acc: 0.9996 - dense_10_acc: 0.9999 - val_loss: 0.6053 - val_dense_2_loss: 0.1921 - val_dense_4_loss: 0.1621 - val_dense_6_loss: 0.1125 - val_dense_8_loss: 0.0763 - val_dense_10_loss: 0.0623 - val_dense_2_acc: 0.9773 - val_dense_4_acc: 0.9811 - val_dense_6_acc: 0.9863 - val_dense_8_acc: 0.9895 - val_dense_10_acc: 0.9933\n",
      "Epoch 15/20\n",
      "47872/48000 [============================>.] - ETA: 0s - loss: 0.0063 - dense_2_loss: 0.0020 - dense_4_loss: 0.0020 - dense_6_loss: 8.5372e-04 - dense_8_loss: 0.0014 - dense_10_loss: 3.8120e-05 - dense_2_acc: 0.9996 - dense_4_acc: 0.9996 - dense_6_acc: 0.9999 - dense_8_acc: 0.9997 - dense_10_acc: 1.0000\n",
      "Epoch 00015: ReduceLROnPlateau reducing learning rate to 0.00040960004553198815.\n",
      "48000/48000 [==============================] - 64s 1ms/step - loss: 0.0063 - dense_2_loss: 0.0020 - dense_4_loss: 0.0020 - dense_6_loss: 8.5157e-04 - dense_8_loss: 0.0014 - dense_10_loss: 3.8213e-05 - dense_2_acc: 0.9996 - dense_4_acc: 0.9996 - dense_6_acc: 0.9999 - dense_8_acc: 0.9997 - dense_10_acc: 1.0000 - val_loss: 0.5983 - val_dense_2_loss: 0.1823 - val_dense_4_loss: 0.1558 - val_dense_6_loss: 0.1117 - val_dense_8_loss: 0.0877 - val_dense_10_loss: 0.0608 - val_dense_2_acc: 0.9780 - val_dense_4_acc: 0.9815 - val_dense_6_acc: 0.9871 - val_dense_8_acc: 0.9890 - val_dense_10_acc: 0.9939\n",
      "Epoch 16/20\n",
      "48000/48000 [==============================] - 65s 1ms/step - loss: 0.0044 - dense_2_loss: 0.0019 - dense_4_loss: 0.0012 - dense_6_loss: 4.9964e-04 - dense_8_loss: 8.4422e-04 - dense_10_loss: 1.5011e-06 - dense_2_acc: 0.9996 - dense_4_acc: 0.9999 - dense_6_acc: 1.0000 - dense_8_acc: 0.9999 - dense_10_acc: 1.0000 - val_loss: 0.6283 - val_dense_2_loss: 0.1888 - val_dense_4_loss: 0.1709 - val_dense_6_loss: 0.1168 - val_dense_8_loss: 0.0886 - val_dense_10_loss: 0.0632 - val_dense_2_acc: 0.9778 - val_dense_4_acc: 0.9804 - val_dense_6_acc: 0.9863 - val_dense_8_acc: 0.9900 - val_dense_10_acc: 0.9930\n",
      "Epoch 17/20\n",
      "47872/48000 [============================>.] - ETA: 0s - loss: 0.0040 - dense_2_loss: 0.0014 - dense_4_loss: 0.0013 - dense_6_loss: 3.7484e-04 - dense_8_loss: 9.3322e-04 - dense_10_loss: 6.1935e-06 - dense_2_acc: 0.9998 - dense_4_acc: 0.9999 - dense_6_acc: 1.0000 - dense_8_acc: 0.9999 - dense_10_acc: 1.0000\n",
      "Epoch 00017: ReduceLROnPlateau reducing learning rate to 0.00032768002711236477.\n",
      "48000/48000 [==============================] - 65s 1ms/step - loss: 0.0040 - dense_2_loss: 0.0014 - dense_4_loss: 0.0012 - dense_6_loss: 3.7384e-04 - dense_8_loss: 9.3074e-04 - dense_10_loss: 6.1773e-06 - dense_2_acc: 0.9998 - dense_4_acc: 0.9999 - dense_6_acc: 1.0000 - dense_8_acc: 0.9999 - dense_10_acc: 1.0000 - val_loss: 0.6123 - val_dense_2_loss: 0.1793 - val_dense_4_loss: 0.1710 - val_dense_6_loss: 0.1166 - val_dense_8_loss: 0.0776 - val_dense_10_loss: 0.0677 - val_dense_2_acc: 0.9778 - val_dense_4_acc: 0.9806 - val_dense_6_acc: 0.9857 - val_dense_8_acc: 0.9896 - val_dense_10_acc: 0.9927\n",
      "Epoch 18/20\n",
      "47872/48000 [============================>.] - ETA: 0s - loss: 0.0033 - dense_2_loss: 0.0011 - dense_4_loss: 0.0011 - dense_6_loss: 3.4236e-04 - dense_8_loss: 7.2331e-04 - dense_10_loss: 1.3919e-05 - dense_2_acc: 0.9999 - dense_4_acc: 0.9999 - dense_6_acc: 1.0000 - dense_8_acc: 0.9999 - dense_10_acc: 1.0000\n",
      "Epoch 00018: ReduceLROnPlateau reducing learning rate to 0.0002621440216898918.\n",
      "\n",
      "Epoch 00018: ReduceLROnPlateau reducing learning rate to 0.00020971521735191345.\n",
      "48000/48000 [==============================] - 65s 1ms/step - loss: 0.0033 - dense_2_loss: 0.0011 - dense_4_loss: 0.0011 - dense_6_loss: 3.4145e-04 - dense_8_loss: 7.2139e-04 - dense_10_loss: 1.3882e-05 - dense_2_acc: 0.9999 - dense_4_acc: 0.9999 - dense_6_acc: 1.0000 - dense_8_acc: 0.9999 - dense_10_acc: 1.0000 - val_loss: 0.6102 - val_dense_2_loss: 0.1856 - val_dense_4_loss: 0.1607 - val_dense_6_loss: 0.1151 - val_dense_8_loss: 0.0881 - val_dense_10_loss: 0.0607 - val_dense_2_acc: 0.9800 - val_dense_4_acc: 0.9823 - val_dense_6_acc: 0.9855 - val_dense_8_acc: 0.9896 - val_dense_10_acc: 0.9940\n",
      "Epoch 19/20\n",
      "47872/48000 [============================>.] - ETA: 0s - loss: 0.0029 - dense_2_loss: 8.5099e-04 - dense_4_loss: 0.0010 - dense_6_loss: 3.3695e-04 - dense_8_loss: 6.7556e-04 - dense_10_loss: 1.6622e-07 - dense_2_acc: 0.9999 - dense_4_acc: 0.9999 - dense_6_acc: 1.0000 - dense_8_acc: 1.0000 - dense_10_acc: 1.0000\n",
      "Epoch 00019: ReduceLROnPlateau reducing learning rate to 0.00016777217388153076.\n",
      "\n",
      "Epoch 00019: ReduceLROnPlateau reducing learning rate to 0.00013421773910522462.\n",
      "48000/48000 [==============================] - 65s 1ms/step - loss: 0.0029 - dense_2_loss: 8.4872e-04 - dense_4_loss: 0.0010 - dense_6_loss: 3.3605e-04 - dense_8_loss: 6.7376e-04 - dense_10_loss: 1.6610e-07 - dense_2_acc: 0.9999 - dense_4_acc: 0.9999 - dense_6_acc: 1.0000 - dense_8_acc: 1.0000 - dense_10_acc: 1.0000 - val_loss: 0.6180 - val_dense_2_loss: 0.1845 - val_dense_4_loss: 0.1664 - val_dense_6_loss: 0.1156 - val_dense_8_loss: 0.0887 - val_dense_10_loss: 0.0628 - val_dense_2_acc: 0.9787 - val_dense_4_acc: 0.9824 - val_dense_6_acc: 0.9868 - val_dense_8_acc: 0.9899 - val_dense_10_acc: 0.9942\n",
      "Epoch 20/20\n",
      "47872/48000 [============================>.] - ETA: 0s - loss: 0.0028 - dense_2_loss: 7.4104e-04 - dense_4_loss: 0.0010 - dense_6_loss: 3.3687e-04 - dense_8_loss: 6.7361e-04 - dense_10_loss: 1.1955e-07 - dense_2_acc: 0.9999 - dense_4_acc: 0.9999 - dense_6_acc: 1.0000 - dense_8_acc: 1.0000 - dense_10_acc: 1.0000  \n",
      "Epoch 00020: ReduceLROnPlateau reducing learning rate to 0.00010737419361248613.\n",
      "48000/48000 [==============================] - 65s 1ms/step - loss: 0.0028 - dense_2_loss: 7.3907e-04 - dense_4_loss: 0.0010 - dense_6_loss: 3.3598e-04 - dense_8_loss: 6.7181e-04 - dense_10_loss: 1.1955e-07 - dense_2_acc: 0.9999 - dense_4_acc: 0.9999 - dense_6_acc: 1.0000 - dense_8_acc: 1.0000 - dense_10_acc: 1.0000 - val_loss: 0.6099 - val_dense_2_loss: 0.1838 - val_dense_4_loss: 0.1657 - val_dense_6_loss: 0.1180 - val_dense_8_loss: 0.0830 - val_dense_10_loss: 0.0595 - val_dense_2_acc: 0.9792 - val_dense_4_acc: 0.9828 - val_dense_6_acc: 0.9870 - val_dense_8_acc: 0.9905 - val_dense_10_acc: 0.9942\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<keras.callbacks.History at 0x270afe6c128>"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from keras.callbacks import ReduceLROnPlateau\n",
    "# TODO: 训练你的模型\n",
    "learnrate_reduce_1 = ReduceLROnPlateau(monitor='val_dense_2_acc', patience=2, verbose=1,factor=0.8, min_lr=0.00001)\n",
    "learnrate_reduce_2 = ReduceLROnPlateau(monitor='val_dense_4_acc', patience=2, verbose=1,factor=0.8, min_lr=0.00001)\n",
    "learnrate_reduce_3 = ReduceLROnPlateau(monitor='val_dense_6_acc', patience=2, verbose=1,factor=0.8, min_lr=0.00001)\n",
    "learnrate_reduce_4 = ReduceLROnPlateau(monitor='val_dense_8_acc', patience=2, verbose=1,factor=0.8, min_lr=0.00001)\n",
    "learnrate_reduce_5 = ReduceLROnPlateau(monitor='val_dense_10_acc', patience=2, verbose=1,factor=0.8, min_lr=0.00001)\n",
    "\n",
    "model.fit(X_train, y_train, epochs=20, batch_size=128,\n",
    "          validation_data=(X_valid, y_valid), \n",
    "         callbacks=[learnrate_reduce_1,learnrate_reduce_2,learnrate_reduce_3,learnrate_reduce_4,learnrate_reduce_5])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 练习：计算你的模型准确率\n",
    "\n",
    "我们刚才得到了模型每个数字的准确率，现在让我们来计算整体准确率，按照完全预测正确数字序列的标准来计算。\n",
    "\n",
    "比如 1,2,3,10,10 预测成了 1,2,10,10,10 算错，而不是算对了80%。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9476"
      ]
     },
     "execution_count": 132,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def evaluate(model):\n",
    "    # TODO: 按照错一个就算错的规则计算准确率.\n",
    "    right = 0\n",
    "    total = len(X_test)\n",
    "    result = model.predict(X_test)\n",
    "\n",
    "    for i in range(total):\n",
    "        if str(np.argmax(result[0][i])) == str(np.argmax(y_test[0][i])) \\\n",
    "                and str(np.argmax(result[1][i])) == str(np.argmax(y_test[1][i])) \\\n",
    "                and str(np.argmax(result[2][i])) == str(np.argmax(y_test[2][i])) \\\n",
    "                and str(np.argmax(result[3][i])) == str(np.argmax(y_test[3][i])) \\\n",
    "                and str(np.argmax(result[4][i])) == str(np.argmax(y_test[4][i])):\n",
    "            right += 1\n",
    "    return right / total\n",
    "    \n",
    "evaluate(model)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 问题 4\n",
    "\n",
    "_你的模型准确率有多少？你觉得你的模型足以解决问题吗？_\n",
    "\n",
    "**回答：0.9476, 我觉得模型可以解决问题。**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 预测值可视化\n",
    "\n",
    "我们将模型的预测结果和真实值画出来，观察真实效果。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-0.5, 139.5, 27.5, -0.5)"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2708c4170b8>"
      ]
     },
     "metadata": {
      "image/png": {
       "height": 127,
       "width": 370
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def get_result(result):\n",
    "    # 将 one_hot 编码解码\n",
    "    resultstr = ''\n",
    "    for i in range(n_len):\n",
    "        resultstr += str(np.argmax(result[i])) + ','\n",
    "    return resultstr\n",
    "\n",
    "index = random.randint(0, n_test-1)\n",
    "y_pred = model.predict(X_test[index].reshape(1,28,140,1))\n",
    "\n",
    "plt.title('real: %s\\npred:%s'%(get_result([y_test[x][index] for x in range(n_len)]), get_result(y_pred)))\n",
    "plt.imshow(X_test[index,:,:,0], cmap='gray')\n",
    "plt.axis('off')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 保存模型\n",
    "\n",
    "模型达到满意的效果以后，我们需要保存模型，以便下次调用。\n",
    "\n",
    "读取的方式也很简单：`model = load_model('model.h5')`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.save('model.h5')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
